0
사용자 정의 어댑터에 바인딩 된 ListView를 보유하는 프래그먼트를 구현하려고합니다. 기본적으로 한 행은 다음과 같습니다. TextViewName ButtonPlus TextViewMarker ButtonMinus ButtonRemove +/- 버튼은 TextViewMarker에 표시된 숫자를 변경합니다. ButtonRemove는 목록에서 행을 제거합니다. 마지막으로 목록에 새 항목을 추가하는 버튼이 있습니다. 항목을 추가 및 제거하고 런타임에 마커 수를 변경할 수 있기 때문에 모든 것이 잘 작동하는 것 같습니다. 불행히도 항목을 제거하면 목록의 다음 항목에 제거 된 항목의 표식 수가 나타납니다. ViewHolder가 여전히 같은 위치에 있고 다음 항목이 방금 태그를 변경 한 것과 같습니다.ListView (안드로이드) 내의 태그 혼란
public class MarkerFragment extends Fragment
{
private MarkerAdapter mAdapter = null;
private EditText mAddItemEditText = null;
private MainActivity mParent = null;
public MarkerFragment(MainActivity parent){mParent = parent;}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_marker, null);
Button b = (Button) view.findViewById(R.id.buttonAddItem);
b.setOnClickListener(new ClickListener(this));
mAddItemEditText = (EditText) view.findViewById(R.id.editTextItem);
mAdapter = new MarkerAdapter(this, mParent);
ListView listView = (ListView) view.findViewById(R.id.markerList);
listView.setAdapter(mAdapter);
return view;
}
public void addItem(String name)
{
mAdapter.addItem(name);
}
public void removeItem(int position)
{
mAdapter.removeItem(position);
}
static class ViewHolder
{
TextView name;
TextView markers;
int position = -1;
}
private class MarkerAdapter extends BaseAdapter
{
private MarkerFragment mParent;
private LayoutInflater mInflater;
private ArrayList<String> mList;
public MarkerAdapter(MarkerFragment parent, Context context)
{
super();
this.mParent = parent;
mInflater = LayoutInflater.from(context);
mList = new ArrayList<String>();
mList.add("item1");
mList.add("item2");
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder;
if(convertView == null)
{
convertView = mInflater.inflate(R.layout.marker_row, null);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.textViewRowName);
holder.markers = (TextView) convertView.findViewById(R.id.textViewMarker);
holder.markers.setText("0");
Button b = (Button) convertView.findViewById(R.id.buttonPlus1Marker);
b.setRotation(180);
b.setOnClickListener(new ClickListener(this.mParent));
b = (Button) convertView.findViewById(R.id.buttonMinus1Marker);
b.setOnClickListener(new ClickListener(this.mParent));
b = (Button) convertView.findViewById(R.id.buttonRemoveMarker);
b.setOnClickListener(new ClickListener(this.mParent));
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
holder.name.setText(mList.get(position));
holder.position = position;
return convertView;
}
public void addItem(String name)
{
mList.add(name);
this.notifyDataSetChanged();
}
public void removeItem(int position)
{
mList.remove(position);
this.notifyDataSetChanged();
}
@Override
public int getCount()
{
return mList.size();
}
@Override
public Object getItem(int position)
{
return mList.get(position);
}
@Override
public long getItemId(int position)
{
return position;
}
}
private class ClickListener implements OnClickListener
{
private StringBuilder sb = new StringBuilder();
private MarkerFragment mParent = null;
public ClickListener(MarkerFragment parent)
{
mParent = parent;
}
@Override
public void onClick(View v)
{
switch(v.getId())
{
case R.id.buttonAddItem:
addItem();
break;
case R.id.buttonMinus1Marker:
alterMarkerNumber(v, -1);
break;
case R.id.buttonPlus1Marker:
alterMarkerNumber(v, 1);
break;
case R.id.buttonRemoveMarker:
removeItem(v);
break;
default:
break;
}
}
private void alterMarkerNumber(View v, int point)
{
View row = (View) v.getParent();
ViewHolder holder = (ViewHolder) row.getTag();
int markers = Integer.parseInt(holder.markers.getText().toString()) + point;
sb.delete(0, sb.capacity()).append(markers);
holder.markers.setText(sb.toString());
mAdapter.notifyDataSetChanged();
}
private void addItem()
{
String name = mAddCardEditText.getText().toString();
if(name.length() > 0)
{
name = name.replace("'", " ").replace("\"", " ");
mAddItemEditText.setText("");
this.mParent.addItem(name);
}
}
private void removeItem(View v)
{
View row = (View) v.getParent();
ViewHolder holder = (ViewHolder) row.getTag();
if(holder.position != -1)
{
this.mParent.removeItem(holder.position);
}
}
}
}
: 목록이 비어있을 때 나는 새 항목을 추가하는 경우, 그것은 여기
코드입니다 ... 목록에 있던 마지막 항목의 마커의 수를 표시합니다, 같은 문제가 발생
감사합니다.
대신 ArrayList 요소를 위치별로 제거하는 대신 객체 (문자열)로 제거하십시오. 제거 할 문자열을 쉽게 가져올 수 있습니다 ... holder.position은 조금 복잡합니다 ... – Braj
이미 시도했지만 작동하지 않았습니다. 어쨌든 고마워. – Jonyjack