繁体   English   中英

如何在列表视图中更改特定行的图像

[英]how to change the image of a particular row in list view

我有一个listview,每一行都有一个图像和一个图像按钮。 每当我们单击该按钮时,它都应该从设备的图像库中选择图像,并替换该特定行的图像。

我可以从图库中选择图像,但是它代替了最后一行的图像,而不是
从我们按下按钮的位置替换行的图像。

请为此提供一些解决方案

我在这里附加代码

public class FirstActivity extends Activity {
String[] names;
CustomAdapter adapter;
private static int RESULT_LOAD_IMAGE = 1;
ListView lv;
int a;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_first);
    Resources res = getResources();
    names = res.getStringArray(R.array.names);
    adapter = new CustomAdapter(this, names);
    lv = (ListView) findViewById(R.id.listView);
    lv.setAdapter(adapter);

}

public void removeAtomPayOnClickHandler(View v) {
    Intent i = new Intent(
            Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
      a=lv.getPositionForView(lv);
      Toast.makeText(this, "---"+a, Toast.LENGTH_SHORT).show();
    startActivityForResult(i, RESULT_LOAD_IMAGE);
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
        Uri selectedImage = data.getData();
        String[] filePathColumn = { MediaStore.Images.Media.DATA };

        Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();
         CHolder.tv.setImageBitmap(BitmapFactory.decodeFile(picturePath));
      //  ImageView imageView = (ImageView) findViewById(R.id.imgView);
        //imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));

    }


}

}

和适配器类的代码

      public class CustomAdapter extends ArrayAdapter<String>{
      Context context;
      String[] input;
      public CustomAdapter(Context c, String[] values) {
    super(c, R.layout.atom_pay_list_item, values);
    this.context = c;
    this.input = values;
    // TODO Auto-generated constructor stub
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    View row = convertView;
    CHolder holder = null;
    if(row == null)
    {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(R.layout.atom_pay_list_item, parent, false);
        holder = new CHolder(row);
        row.setTag(holder);
    }
    else{
        holder = (CHolder) row.getTag();
    }

    //holder.tv.setImageDrawable(drawable)(input[position]);
    ///iv.setImageDrawable(R.drawable.abc_ic_search);
    return row;
}
static class CHolder{
    public static ImageView tv;
    public static ImageButton iv;
    CHolder(View v)
    {
        tv = (ImageView) v.findViewById(R.id.textview);
        iv = (ImageButton) v.findViewById(R.id.imageview);
    }
}

}

在实际的适配器中,您可以在图像中添加一个Click侦听器,然后从那里进行操作。 例如,

在getView()中

if(row == null){
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     row = inflater.inflate(R.layout.atom_pay_list_item, parent, false);
     holder = new CHolder(row);
     row.setTag(holder);

     // Add this in
     iv.setOnClickListener(new OnClickListener(){
         @Override
         public void onClick(View v){
              v.setImageResource(R.id.new_image_id);
              // could obviously be more complex, like your  onActivityResult() functionality
         }
     }
}
...

return row;

如果您需要单击以在接收器中注册,则可以向您的活动发送广播。 换句话说,代替v.setImageResource(R.id.new_image_id);

Intent intent = new Intent("UPDATE_IMAGE");
intent.putExtra("clicked_position", position);
sendBroadcast(intent);

然后在您的活动中,在将registerReceiver, new UpdateReceiver(), new IntentFilter("UPDATE_IMAGE"); 在您的活动的onCreate方法中。

public class UpdateReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        intent.getExtra("clicked_position", -1);
        int positioin = intent.getExtras().getInt("clicked_position", -1);
        // do what you need to with your clicked image given its position
        // basically do onActivityResult() functionality here
    }
}

只需确保在活动的onDestroy中注销您的接收器,以避免泄漏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM