[英]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.