簡體   English   中英

無法將 ArrayList 放入 Android Studio 中 CustomAdapter 內的 ListView

[英]Can't put an ArrayList in a ListView inside a CustomAdapter in Android Studio

我在理解如何完成這部分代碼時遇到問題。 這是一個借助 API 搜索游戲列表的應用程序。 到目前為止,一切都很好,但最后一件事。

在代碼中,首先我有一個簡單的活動,其中包含一個edit_text、一個按鈕和一個名為“lv_listofgames”的空列表視圖。

然后,當我按下“搜索”按鈕時,我用由 imageview、一個名為“list_item_text”的列表視圖和一個按鈕組成的一系列行填充“lv_listofgames”。 到目前為止,一切似乎都很好。

然后我應該用 arraylist 的內容填充“lv_listofgames”中的“list_item_text”,但我無法實現。 我嘗試了很多方法,但我被卡住了。 我什至嘗試使用 2 個適配器,但應用程序每次都崩潰或“list_item_text”仍然為空。

arrayList 類似於:[game_title='Name', release_date='date', platform=platform]

我似乎非常接近解決方案,但我無法弄清楚如何實現這一目標。 我要瘋了:(

tl; dr:問題:當我按下“搜索”按鈕時,arrayList 內容不會出現在 ListView“list_item_text”中。

這是代碼,如果有問題請告訴我,謝謝:

public class MainActovity extends AppCompatActivity {

    EditText et_searchName;
    Button btn_search;
    ListView lv_listofgames;
    ListView lv;

    final GamesDataService gameDataService = new GamesDataService(MainActovity.this);

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

        et_searchName = findViewById(R.id.et_searchName);
        btn_search = findViewById(R.id.btn_search);
        lv_listofgames= findViewById(R.id.lv_listofgames);

        btn_search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                gameDataService.getGameName(et_searchName.getText().toString(), new GamesDataService.searchGamesResponse() {
                    @Override
                    public void onError(String message) {
                        Toast.makeText(MainActovity.this, "Error", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onResponse(List<GamesReportModel> gamesReportModels) {

                        List<GamesReportModel> newName = gamesReportModels;

                        List<String> stringsList = new ArrayList<>(newName.size());
                        for (Object object : newName) {
                            stringsList.add(Objects.toString(object, null));
                        }

                        System.out.println("stringsList:" + stringsList);

                        lv = (ListView) findViewById(R.id.lv_listofnames);
                        MyListAdapter adapter = new MyListAdapter(MainActovity.this, R.layout.details, stringsList);
                        lv.setAdapter(adapter);

                        adapter.notifyDataSetChanged();
                    }
                });
            }
        });
    }

    class MyListAdapter extends ArrayAdapter<String> {
        private int layout;
        public MyListAdapter(@NonNull Context context, int resource, @NonNull List<String> objects) {
            super(context, resource, objects);
            layout = resource;
        }

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

            MainActovity.ViewHolder mainViewHolder = null;
            if(convertView == null) {
                LayoutInflater inflater = LayoutInflater.from(getContext());
                convertView = inflater.inflate(layout, parent, false);
                MainActovity.ViewHolder viewHolder = new MainActovity.ViewHolder();
                viewHolder.thumbnail = (ImageView) convertView.findViewById(R.id.list_item_thumbnail);
                viewHolder.title = (ListView) convertView.findViewById(R.id.list_item_text);
                viewHolder.button = (Button) convertView.findViewById(R.id.list_item_btn);
                convertView.setTag(viewHolder);

                viewHolder.button.setOnClickListener(new View.OnClickListener(){
                    @Override
                    public void onClick(View v) {

                    }
                });
            }
            else {
                mainViewHolder = (MainActovity.ViewHolder) convertView.getTag();
            }
            return convertView;
        }
    }
    public class ViewHolder {
        ImageView thumbnail;
        ListView title;
        Button button;
    }
}

游戲報告模型:

public class GamesReportModel {

    private String game_title;
    private String release_date;
    private String platform;
 
    public GamesReportModel(String game_title, String release_date, String platform) {
        this.game_title = game_title;
        this.release_date = release_date;
        this.platform = platform;
    }

    public GamesReportModel() {
    }

    @Override
    public String toString() {
        return  "game_title='" + game_title + '\'' +
                ", release_date='" + release_date + '\'' +
                ", platform=" + platform;
    }

    public String getGame_title() {
        return game_title;
    }

    public void setGame_title(String game_title) {
        this.game_title = game_title;
    }

    public String getRelease_date() {
        return release_date;
    }

    public void setRelease_date(String release_date) {
        this.release_date = release_date;
    }

    public String getPlatform() {
        return platform;
    }

    public void setPlatform(String platform) {
        this.platform = platform;
    }
}

您需要在代碼中更改兩件事才能獲得所需的效果。

  1. 在您的視圖布局( R.layout.details )中,將ListView替換為TextView因為您只是試圖顯示給定行的文本(而不是每行內的嵌套列表)。 然后更新視圖持有者以保持正確的視圖類型
viewHolder.title = (TextView) convertView.findViewById(R.id.list_item_text);
 
 //...
 
public class ViewHolder {
  ImageView thumbnail;
  TextView title;
  Button button;
}
  1. 在適配器的getView方法中,您必須實際設置要為該行顯示的文本。 您從未將文本設置為在任何地方顯示,這就是您的行為空白的原因。 這應該是這樣的:
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

    MainActovity.ViewHolder mainViewHolder = null;
    if(convertView == null) {
        LayoutInflater inflater = LayoutInflater.from(getContext());
        convertView = inflater.inflate(layout, parent, false);
        MainActovity.ViewHolder viewHolder = new MainActovity.ViewHolder();
        viewHolder.thumbnail = (ImageView) convertView.findViewById(R.id.list_item_thumbnail);
        viewHolder.title = (TextView) convertView.findViewById(R.id.list_item_text);
        viewHolder.button = (Button) convertView.findViewById(R.id.list_item_btn);
        convertView.setTag(viewHolder);
    }
    else {
        mainViewHolder = (MainActovity.ViewHolder) convertView.getTag();
    }
    
    // Here, you need to set what values to show for this row - this
    // is why your list is empty/blank
    mainViewHolder.title.setText((String)getItem(position));
    
    return convertView;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM