【问题标题】:Passing image Id to custom listview adapter将图像 ID 传递给自定义列表视图适配器
【发布时间】:2016-12-02 17:36:50
【问题描述】:

如何将图像资源 ID 传递给我的自定义适配器?我在名为 routedetails 的活动中有一个复选框。当复选框被选中时,我想在列表视图中的该项目旁边显示一个复选标记。但要做到这一点,我需要将 imageId 传递给自定义适配器。我试着用 putExtra 的意图来做。但这不起作用。

这是我的带有复选框代码的 RouteDetails.java

public class RouteDetails extends AppCompatActivity {

ImageView routeImage;
String routeName;
CheckBox routeCheckBox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_route_details);

    //back button for route details view
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);


    ///////checkbox///////////////////////////////////////////
   routeCheckBox = (CheckBox) findViewById(R.id.routeCheckBox);
  //////  final ImageView checkImageView = (ImageView) findViewById(R.id.checkImageView);
    routeCheckBox.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view)
    {
      if (routeCheckBox.isChecked())
      {
          //checkImageView.setImageResource(R.drawable.checkmark);
          Intent check = new Intent(RouteDetails.this,CustomAdapter.class);
          check.putExtra("checkImageResource", R.drawable.checkmark);
          startActivity(check);
        /////////////////////////////////////////////


//sets actionbar title
routeName = getIntent().getExtras().getString("routeName");
getSupportActionBar().setTitle(routeName);

//TextView for route details
final TextView routeDetailsView = (TextView) findViewById(R.id.routeDetailsView);
routeDetailsView.setText(getIntent().getExtras().getCharSequence("route"));

//ImageView for route details
routeImage = (ImageView) findViewById(R.id.routeImage);
final int mImageResource = getIntent().getIntExtra("imageResourceId", 0);
 routeImage.setImageResource(mImageResource);

这是自定义适配器

  class CustomAdapter extends ArrayAdapter<CharSequence>{

   public CustomAdapter(Context context, CharSequence[] routes) {
    super(context, R.layout.custom_row ,routes);
   }

@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {

LayoutInflater routeInflater = LayoutInflater.from(getContext());
View customView = convertView;
if(customView == null){customView = routeInflater.inflate(R.layout.custom_row, parent, false);}

CharSequence singleRoute = getItem(position);
TextView routeText = (TextView) customView.findViewById(R.id.routeText);
routeText.setText(singleRoute);

////////trying to set checkmark/////
ImageView checkImageView = (ImageView) customView.findViewById(R.id.checkImageView);
checkImageView.setImageResource(((Activity)    getContext()).getIntent().getIntExtra("checkImageResource",0));
 ////////////////////////////////////////

return customView;
} 

这是我的主要活动中使用的适配器

  list view with xml array of routes
final CharSequence[] routeListViewItems = getResources().getTextArray(R.array.routeList);

//custom adapter for list view
ListAdapter routeAdapter = new CustomAdapter(this, routeListViewItems);
final ListView routeListView = (ListView) findViewById(R.id.routeListView);
routeListView.setAdapter(routeAdapter);

任何帮助将不胜感激

【问题讨论】:

  • 在运行代码时粘贴您的日志猫错误
  • 今晚晚些时候我才能做到这一点,我现在离开我的电脑了。但它说 customAdapter 不是一个活动,所以我不能使用这行代码: checkImageView.setImageResource(((Activity) getContext()).getIntent().getIntExtra("checkImageResource",0));我不知道我是否在正确的轨道上尝试做我正在做的事情。有没有更简单的方法?
  • 这正是我想强调的一点。您不能在非 actvitvy 类上调用 startactivity() 方法。您可以查看此tutorial。我猜这就是你想要做的。
  • 谢谢。 Listviewcheckbox 并不是我想要的。我会尝试更好地解释。当您单击列表视图项目时,它会打开一个新活动。在新活动中有一个复选框。当我选中该框然后单击后退按钮时,我想要一个复选标记图像来显示该列表视图项的 Nex。我在每个列表视图行中放置了一个图像视图。我希望能够根据复选框控制图像
  • 单击详细信息页面后,是否要在列表项上设置复选标记?或者详细信息页面会决定在列表中使用哪种图像?

标签: android listview android-intent custom-adapter


【解决方案1】:

基本上你创建了两个活动。比方说,MyListViewActivity 包含一个 ListView,其项目不过是包含 ImageView 和 TextView 的自定义视图; 然后是一个包含 CheckBox 元素的 CheckBoxActivity。 当在 MyListViewActivity 中单击列表项时,您使用 startActivityForResult() 方法启动 CheckboxAtivity。

最后,在 CheckBoxActivity 中,当一个 checkBox 项目被选中时,它的 textValue 被发送回 MyListViewActivity 以更新相应的 imageView。 见下面代码sn-ps:

MyListViewActivity 的布局文件:activity_my_list_view.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_my_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="YourPackageNameHere.MyListViewActivity" >

<ListView
 android:id="@+id/list"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" >
</ListView>

</RelativeLayout>

自定义列表项的布局文件:list_single.xml

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TableRow>
    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="horizontal">
        <ImageView
            android:id="@+id/img"
            android:layout_width="40dp"
            android:layout_height="40dp"/>

        <TextView
            android:id="@+id/txt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
             android:layout_marginLeft="@dimen/activity_horizontal_margin"
            android:layout_gravity="center_horizontal|center_vertical" />

    </LinearLayout>


</TableRow>
</TableLayout>

CheckBoxActivity 的布局文件:activity_checkbox.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_checkbox"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="YourPackageNameHere.CheckboxActivity">

<CheckBox
    android:text="CheckBox1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"

    android:id="@+id/checkBox1" />
<CheckBox
    android:text="CheckBox2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/checkBox2" />
 </LinearLayout>

MyListViewActivity 的代码:

package YourPackageNameHere;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MyListViewActivity extends AppCompatActivity {
ImageView img;
ListView list;
private static final int MY_REQUEST_CODE= 1;
String[] itemNames = {
        "Google Plus",
        "Twitter",
        "Windows",
        "Bing",
        "Itunes",
        "Wordpress",
        "Drupal"
} ;
Integer[] imageId = {
        R.drawable.ic_home_black_18dp,
        R.drawable.ic_account_circle_black_18dp,
        R.drawable.ic_fingerprint_black_18dp,
        R.drawable.ic_help_black_18dp,
        R.drawable.ic_settings_black_18dp,
        R.drawable.ic_power_settings_new_black_18dp,
        R.drawable.ic_directions_run_black_18dp

};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_list_view);

    CustomList adapter = new CustomList(MyListViewActivity.this, itemNames, imageId);
    list=(ListView)findViewById(R.id.list);
    list.setAdapter(adapter);
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            Toast.makeText(MyListViewActivity.this, "You Clicked at " + itemNames[+ position], Toast.LENGTH_SHORT).show();

            //get the image that has been clicked
            img= (ImageView) view.findViewById(R.id.img);

            //Starting the CheckBoxAtivity for  result
            Intent mIntent = new Intent(getBaseContext(), CheckboxActivity.class);
            startActivityForResult(mIntent, MY_REQUEST_CODE);
        }
    });

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == MY_REQUEST_CODE) {

        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("result");
            switch (result){
                case "CheckBox1":
                    img.setImageResource(R.drawable.ic_gps_fixed_black_18dp);
                    break;
                case "CheckBox2":
                    img.setImageResource(R.drawable.cast_ic_notification_0);
                    break;
            }
        }

    }
}//onActivityResult

public class CustomList extends ArrayAdapter<String> {

    private final Activity context;
    private final String[] itemNames;
    private final Integer[] imageId;
    public CustomList(Activity context, String[] itemNames, Integer[] imageId) {
        super(context, R.layout.list_single, itemNames);
        this.context = context;
        this.itemNames = itemNames;
        this.imageId = imageId;

    }
    @Override
    public View getView(int position, View view, ViewGroup parent) {
        LayoutInflater inflater = context.getLayoutInflater();
        View rowView= inflater.inflate(R.layout.list_single, null, true);
        TextView txtTitle = (TextView) rowView.findViewById(R.id.txt);

        ImageView imageView = (ImageView) rowView.findViewById(R.id.img);
        txtTitle.setText(itemNames[position]);

        imageView.setImageResource(imageId[position]);
        return rowView;
    }
}
}

ChecboxActivity 的代码:

package YourPackageNameHere
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.CheckBox;
import android.widget.CompoundButton;

public class CheckboxActivity extends AppCompatActivity {

CheckBox mCheckBox1;
CheckBox mCheckBox2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_checkbox);

    mCheckBox1 = (CheckBox) findViewById(R.id.checkBox1);
    mCheckBox2 = (CheckBox) findViewById(R.id.checkBox2);

    mCheckBox1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            if(mCheckBox1.isChecked()){
                sendResultToLisViewActivity((String) mCheckBox1.getText()); //send the text string of mCheckBox1 to MyListViewActivity
            }
        }
    });

    mCheckBox2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            if(mCheckBox2.isChecked()){
                sendResultToLisViewActivity((String) mCheckBox2.getText()); //send the text string of mCheckBox1 to MyListViewActivity
            }
        }
    });

}

public void sendResultToLisViewActivity(String  mStringExtra){
    Intent returnIntent = new Intent();
    returnIntent.putExtra("result",mStringExtra);
    setResult(Activity.RESULT_OK,returnIntent);
    finish();
}
}

最后在您的 MainActivity onCreate() 方法中启动 MyListViewActivity,如下所示:

Intent i = new Intent(MainActivity.this, MyListViewActivity.class);
startActivity(i);

Ps:我参考了这个 link 来创建带有图像和文本的自定义 ListView。

【讨论】:

  • 哇,感谢您提供如此详细的回复。我现在不是我的电脑。我会在今晚晚些时候尝试处理它并报告回来。所以我想我需要将我的自定义适配器移动到我的主要活动中。因为现在它在一个单独的 java 文件中。
  • 是的,您的自定义适配器应该在您拥有 listView 的活动中调用。只需仔细遵循我编写的代码中的逻辑并将其适应您的用例即可。 [它完全按照您在上面评论中的解释 -:) ]
  • 嘿,所以我按照你的回答,我得到了它的大部分工作!我遇到的唯一问题是,无论我从哪个项目中选中该框,每个列表视图项目旁边都会显示复选标记。但我应该能够解决这个问题,因为我今晚只有 30 分钟的时间来看看它。再次感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 2012-02-21
  • 2011-12-31
  • 2020-06-01
  • 1970-01-01
相关资源
最近更新 更多