カスタムアダプターを持つカスタムオブジェクトのListView
があります。リストの個々のアイテムをクリックすると、そのアイテムを更新した結果の新しいアクティビティが開始され、ListView
アイテムの右側に緑色のティックイメージが表示されます。TextView
です。ちょうどrow.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.tick_green, 0)
を使用します。下にスクロールすると、同じドロアブルを持つ別の行が表示されます。前後にスクロールするだけで、このドロアブルがランダムに異なる行に設定されます。ほとんどの答えは、ビューがリサイクルされているためですが、他のアクティビティが結果を返すときに、表示されているかどうかにかかわらず、1つの行を変更する方法は何ですか?リストビューとアクティビティからListViewまたはRecycleViewで1つのアイテムのみを変更する
コード - 提案hereとして
private ItemAdapter adapter;
private ArrayList<Item> labels;
private ArrayList<Item> updatedItems;
private TextView label;
@Override
protected void onCreate(Bundle savedInstanceState) {
// initializations
updatedItems = new ArrayList<>();
adapter = new ItemAdapter(getBaseContext(), R.layout.label_list_item, labels);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
label = (TextView) listView.getChildAt(position - listView.getFirstVisiblePosition()).findViewById(R.id.text1);
Item item = adapter.getItem(position);
Intent myIntent = new Intent(ProviderPutawayActivity.this, PutawayScanLocationActivity.class);
myIntent.putExtra("ITEM", item);
ProviderPutawayActivity.this.startActivityForResult(myIntent, 1);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == 1) {
Item item = (Item) data.getSerializableExtra("ITEM");
label.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.tick_green, 0);
}
v.findViewById(r.id.text1)
と(TextView) listView.getChildAt(position - listView.getFirstVisiblePosition()).findViewById(R.id.text1)
両方が同じ問題を抱えています。
ItemAdapterクラス -
public class ItemAdapter extends ArrayAdapter<Item> {
private View v;
public ItemAdapter(Context context, int resource, List<Item> items) {
super(context, resource, items);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
v = convertView;
TextView label;
if(v == null) {
LayoutInflater vi;
vi = LayoutInflater.from(getContext());
v = vi.inflate(R.layout.label_list_item, null);
}
Item item = getItem(position);
if(item != null) {
label = (TextView)v.findViewById(R.id.text1);
if(label != null) label.setText(String.valueOf(item.getLabel()));
}
return v;
}
}
は、どのように私は私だけクリックされた行を更新してくださいますか?
問題を解決するには、ビューホルダーパターンを実装する必要があります。あなたはそれについて学ぶことができるチュートリアルがたくさんあります。 – Gautam
'ListView'の代わりに' RecyclerView'を使って同じことをしようとしたときに使いましたが、1行だけをクリックした後に2つの別々の行が描画可能を示しました。 –