【问题标题】:cannot use CustomAdapter in Listview不能在 Listview 中使用 CustomAdapter
【发布时间】:2017-11-29 08:57:53
【问题描述】:

我是 Android 编程新手,我即将创建 listview 应用程序,该应用程序将显示带有图片、标题、评级和类型的电影列表。 当我运行应用程序时,我看到白屏,即为空。布局没有问题,我创建了两个布局,一个是activity_main,另一个是custom_layout。 p>

MainActivity.java

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.ListViewCompat;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.Arrays;

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    int[] images = {R.drawable.dfg,R.drawable.godf,R.drawable.godf2,R.drawable.thedark,R.drawable.twelv,R.drawable.shindl};
    String[] movie_titles = getResources().getStringArray(R.array.Movie_titles);
    String[] movie_ratings=getResources().getStringArray(R.array.Movie_ratings);
    String[] movie_janrs=getResources().getStringArray(R.array.Movie_janrs);
    setContentView(R.layout.activity_main);
    ListView mylist = (ListView) findViewById(R.id.list);
    ArrayList<String> rowItems = new ArrayList<>();
    ArrayAdapter<String> myadapter = new ArrayAdapter<>
(this,android.R.layout.simple_list_item_1,rowItems);
    if(mylist!=null){
        mylist.setAdapter(myadapter);
    }
}
}

CustomAdapter.java

import android.content.Context;
import android.support.annotation.IdRes;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class CustomAdapter extends ArrayAdapter<RowItem> {


public CustomAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull List<RowItem> objects) {
    super(context, resource, objects);
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    RowItem rowItem = getItem(position);
    if(convertView ==null){
        LayoutInflater vi = LayoutInflater.from(getContext());
        convertView = vi.inflate(R.layout.custom_layout,null);
        //convertView = LayoutInflater.from(getContext()).inflate(R.layout.custom_layout,parent,false);
    }
    if(rowItem!=null){
        ImageView tvImage = (ImageView) convertView.findViewById(R.id.shekil);
        TextView tvTittle = (TextView) convertView.findViewById(R.id.ad);
        TextView tvRating = (TextView) convertView.findViewById(R.id.rating);
        TextView tvJanr = (TextView) convertView.findViewById(R.id.janr);
        if(tvImage!=null && tvTittle!=null && tvRating!=null && tvJanr!=null){
            tvImage.setImageResource(rowItem.getImages());
            tvTittle.setText(rowItem.getMovie_titles());
            tvRating.setText(rowItem.getMovide_ratings());
            tvJanr.setText(rowItem.getMovide_janrs());
        }
    }

    return convertView;
}

RowItem.java

public class RowItem {
    int images;
    String movie_titles;
    String movide_ratings;
    String movide_janrs;

public RowItem(int images, String movie_titles, String movide_ratings, String movide_janrs) {
    this.images = images;
    this.movie_titles = movie_titles;
    this.movide_ratings = movide_ratings;
    this.movide_janrs = movide_janrs;
}

public int getImages() {
    return images;
}

public String getMovie_titles() {
    return movie_titles;
}

public String getMovide_ratings() {
    return movide_ratings;
}


public String getMovide_janrs() {
    return movide_janrs;
}

}

【问题讨论】:

    标签: java android listview arraylist


    【解决方案1】:

    使用这个

    CustomAdapter myadapter = new CustomAdapter(this,R.layout.custom_layout,rowItems);
    

    而不是这个

     ArrayAdapter<String> myadapter = new ArrayAdapter<>
    (this,android.R.layout.simple_list_item_1,rowItems);
    

    编辑

    将此构造函数添加到您的 CustomAdapter

    public CustomAdapter(Context context, int textViewResourceId, ArrayList<RowItem> items) {
            super(context, textViewResourceId, items);
        }
    

    编辑 2

    使用

    ArrayList<RowItem> rowItems;
    

    而不是这个

    ArrayList<String> rowItems;
    

    【讨论】:

    • 抱歉,但是当我将 ArrayAdapter 更改为 CustomAdapter 时,问题出现在 CustomAdapter 构造函数中。无法解析超级方法,截图如下:drive.google.com/file/d/16cTZ7qTn3rUfzh2p8V6Gtxxk3GXB79Pd/view
    • @Marada 这将解决您的问题stackoverflow.com/questions/2265661/…
    • 嗯,我按照你说的做了,但是当我这样做时,MainActivity.java 中出现了这条红线drive.google.com/file/d/1w9BsN74c0Sh6d_UY66SH43yR2gCd1__A/view
    • @Marada 添加这个 ArrayList&lt;RowItem&gt; rowItems;
    • :( 不幸的是。我已经按照你说的做了尝试,确实红线消失了。当我运行应用程序时,我再次看到白屏。我认为我的数组没有分配到 arraylist (rowItems),现在我我试图弄清楚如何将我的数组放入 arraylist,因为它表明它们从未被使用过。
    【解决方案2】:

    问题来了

    ArrayAdapter<String> myadapter = new ArrayAdapter<>
     (this,android.R.layout.simple_list_item_1,rowItems);  
     if(mylist!=null){       
        mylist.setAdapter(myadapter);
     }
    

    您正在使用 arrayadapter 而不是您的 CustomAdapter。

    CustomAdapter myadapter = new CustomAdapter(this,R.layout.custom_layout,rowItems);
         if(mylist!=null){
             mylist.setAdapter(myadapter);
    

    你的 CustomAdapter 应该是这样的:

    public CustomAdapter(Context context, int textViewResourceId, ArrayList<RowItem> items) {
            super(context, textViewResourceId, items);
        }
    

    您在问题上分享的内容和在图片上分享的内容似乎不同。以上代码具有相同的构造函数,不会产生任何问题。

    编辑

    在您的 MainActivity.java 中,

    替换

    ArrayList<String> rowItems = new ArrayList<>();
    

    ArrayList<RowItem> rowItems = new ArrayList<>();
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多