将ListView转换为RecyclerView

问题描述 投票:0回答:2

我在我的应用中有一个列表视图。我想将其更改为回收者视图,但是即使使用不同的教程,我也没有得到它。

我正在使用:https://www.spreys.com/listview-to-recyclerview/我在这里的“ getView”部分失败了。

这是我的ListActivity和LeagueArrayAdapter的代码。

感谢您的帮助。

ListActivity:

public class ListActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

    private ArrayAdapter adapter;
    private final int REQUEST_CODE_EDIT = 1;
    private static LeagueDAO leagueDAO;


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

        leagueDAO = MainActivity.getLeagueDAO();
        List<League> allLeagues1 = leagueDAO.getLeagues();

        if (allLeagues1.size() == 0) {
            leagueDAO.insert(new League("HVM Landesliga 19/20","https://hvmittelrhein-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=MR+19%2F20&group=247189"));
            allLeagues1 = leagueDAO.getLeagues();
        }

        adapter = new LeagueArrayAdapter(this, R.layout.league, allLeagues1);
        ListView lv = findViewById(R.id.league_list);
        lv.setAdapter(adapter);
        lv.setOnItemClickListener(this);
        registerForContextMenu(lv);

        Button btn_league_add = findViewById(R.id.btn_league_add);
        btn_league_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(ListActivity.this, EditActivity.class);
                startActivity(intent);
            }
            });
    }

    @Override
    public void onCreateContextMenu(ContextMenu contMenu, View v,
                                    ContextMenu.ContextMenuInfo contextmenuInfo) {
        super.onCreateContextMenu(contMenu, v, contextmenuInfo);
        getMenuInflater().inflate(R.menu.team_list_context_menu, contMenu);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo acmi=
                (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        League league = (League)adapter.getItem(acmi.position);
        switch (item.getItemId()) {
            case R.id.evliconit_edit:
                editEntry(league, acmi.position);
                return true;
            case R.id.evliconit_del:
                leagueDAO.delete(league);
                adapter.remove(league);
                adapter.notifyDataSetChanged();
                return true;
            default:
                return super.onContextItemSelected(item);
        }
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        League team = (League)adapter.getItem(position);
        editEntry(team, position);
    }


    private void editEntry(League league, int position) {
        Intent intent = new Intent(this, EditActivity.class);
        intent.putExtra("team", league);
        intent.putExtra("position", position);
        startActivityForResult(intent, REQUEST_CODE_EDIT);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        if (requestCode == REQUEST_CODE_EDIT && resultCode == RESULT_OK && intent != null) {
            Bundle extras = intent.getExtras();
            int position = extras.getInt("position");
            League league = (League) adapter.getItem(position);
            league.setLeague_name(extras.getString("league_name"));
            league.setLeague_url(extras.getString("league_url"));
            adapter.notifyDataSetChanged();
        }
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        leagueDAO = MainActivity.getLeagueDAO();
        List<League> allLeagues1 = leagueDAO.getLeagues();
        adapter = new LeagueArrayAdapter(this, R.layout.league, allLeagues1);
        ListView lv = findViewById(R.id.league_list);
        lv.setAdapter(adapter);
        lv.setOnItemClickListener(this);
        registerForContextMenu(lv);
    }

LeagueArrayAdapter:

public class LeagueArrayAdapter extends ArrayAdapter<League> {

    private List<League> leagues;
    private Context context;
    private int layout;

    public LeagueArrayAdapter(Context context, int layout, List<League> leagues) {
        super(context, layout, leagues);
        this.context = context;
        this.layout = layout;
        this.leagues = leagues;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        League league = leagues.get(position);
        if (convertView == null)
            convertView = LayoutInflater.from(context).inflate(layout, null);
        TextView tv_name = convertView.findViewById(R.id.tv_name);
        TextView tv_url = convertView.findViewById(R.id.tv_url);
        tv_name.setText(league.getLeague_name());
        tv_url.setText(league.getLeague_url());
        return convertView;
        }
}
java android android-recyclerview android-listview
2个回答
0
投票

我使用RecyclerView.Adapter重建了ListView适配器。

  1. onCreateView被调用为屏幕上的每个可见容器。如果您的屏幕可以显示10行数据,那么RecyclerView会生成11-12个容器(ViewHolder)
  2. onBindView滚动时使用新数据更新这些容器。
  3. MyViewHolder是保存有关每一行数据的数据的对象(容器)
  4. static classbind()内部起作用以避免适配器中的任何内存泄漏。
  5. 我们可以使用ContextRecyclerView.Adapter访问itemView中的parent
  6. itemView是每个容器的膨胀视图(ViewHolder)。
  7. 在ViewHolder的构造函数中初始化您的View,以便将它们分配一次。
public class LeagueArrayAdapter extends RecyclerView.Adapter<LeagueArrayAdapter.MyViewHolder> {

    private ArrayList<League> leagues;

    public LeagueArrayAdapter(ArrayList<League> leagues) {
        this.leagues = leagues;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return LayoutInflater.from(parent.getContext()).inflate(R.layout.row_league, parent, false);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.bind(leagues.get(position));
    }

    @Override
    public int getItemCount() {
        return 0;
    }

    static class MyViewHolder extends RecyclerView.ViewHolder {

        TextView tv_name;
        TextView tv_url;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            tv_name = itemView.findViewById(R.id.tv_name);
            tv_url = itemView.findViewById(R.id.tv_url);
        }

        void bind(League league) {
            tv_name.setText(league.getLeague_name());
            tv_url.setText(league.getLeague_url());
        }

    }

}

0
投票

我建议检查Groupie Lbrary,它与recyclerView一起使用,并使您的生活更加轻松,这里有一个示例,介绍了如何使用它(我用kotlin编写代码,但应该没什么不同来自Java)

首先,将这些行添加到您的Build.gradle(app)文件中

implementation 'com.xwray:groupie:2.3.0'
implementation 'com.xwray:groupie-kotlin-android-extensions:2.3.0'

然后在您的活动中创建一个适配器,然后将适配器设置为您的recyclerView

val myAdapter = GroupAdapter<ViewHolder>()
recyclerView.adapter = myAdapter

就像这样,您将适配器设置为您的recyclerView,但是您必须创建“项目”以放入recyclerView中。您可以像这样创建一个项目

class MyItem: Item() {
    override fun getLayout() = R.layout.layout_seen

    override fun bind(viewHolder: ViewHolder, position: Int){

    }
}

在getLayout方法中,返回要显示在recyclerView内部的布局,您可以使用bind方法对我们要应用于显示的布局进行任何类型的修改。

最后,我们可以通过这种方式将项目添加到适配器中

myAdapter.add(MyItem())
myAdapter.notifyDataSetChanged()

有关详细信息,请检查库,在这里我只是解释了如何将项目简单地添加到RecyclerView中>]

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.