【问题标题】:Unconditional layout inflation from view adapter: Should use View Holder pattern -crash the app来自视图适配器的无条件布局膨胀:应该使用 View Holder 模式 - 使应用程序崩溃
【发布时间】:2019-07-25 13:43:59
【问题描述】:

我有警告导致我的应用程序崩溃。

这是警告 ::

((((来自视图适配器的无条件布局膨胀:应该使用视图持有者模式(使用传递给此方法的回收视图作为第二个参数)以获得更平滑的滚动))))

这是我的代码::

public class ContactsAdapter extends ArrayAdapter<Contacts> {

    Context mCtx;
    int layoutRes ;
    List<Contacts> contactsList;


    public ContactsAdapter(Context mCtx, int layoutRes, List<Contacts> 
                   contactsList)
       {

        super(mCtx, layoutRes, contactsList);

        this.mCtx = mCtx ;
        this.layoutRes = layoutRes ;
        this.contactsList = contactsList ;

    }

    @NonNull
    @Override
      public View getView(int position, @Nullable View convertView, 
                            @NonNull 
      ViewGroup parent) {
        LayoutInflater inflater = LayoutInflater.from(mCtx);

            View view = inflater.inflate(layoutRes, null);

            TextView textView = view.findViewById(R.id.textViewContactMessage);

            Contacts contacts = contactsList.get(position);

            textView.setText(contacts.getPhone());

            textView.setText(contacts.getContext());

            return view;
        }

    }

警告在行::: 查看视图 = inflater.inflate(layoutRes, null);

这是我的 MessageActivity 代码::

public class MessageActivity extends AppCompatActivity {


    List<Contacts> contactsList;
    ListView listView;

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

        mDatabase = openOrCreateDatabase(MainActivity.DATABASE_NAME, MODE_PRIVATE, null);

        contactsList = new ArrayList<>();
        listView = (ListView) findViewById(R.id.listViewContactMessage);

        loadContact_dbFromDatabase();
    }


    private void loadContact_dbFromDatabase(){
        String sql = " SELECT * FROM contact_message";
        Cursor cursor = mDatabase.rawQuery(sql, null);

        if (cursor.moveToFirst()){

            do {
                contactsList.add(new Contacts (
                    cursor.getInt(0),
                    cursor.getString(1),
                    cursor.getString(2)
                ));

            }while (cursor.moveToNext());

                ContactsAdapter adapter = new ContactsAdapter(this, R.id.textViewContactMessage, contactsList);
                listView.setAdapter(adapter);
        }
    }
}

我知道其他人说这个问题,但我不知道如何更改我的代码!!!

谁能告诉我该怎么办??!!

【问题讨论】:

  • 你如何使用这个适配器?你能展示你的代码吗?
  • @anil 是的,我编辑我的代码
  • @anil 你又看到代码了吗???
  • 您需要实现 ViewHolder 模式,如下面的回答。但我建议你使用 CursorAdapter 或(如果你想使用自己的适配器)RecyclerView 而不是 ListView
  • @anil 我想用 RecyclerView 但我不知道怎么用!!!

标签: java android


【解决方案1】:

我认为您正在转换视图中创建另一个视图,这就是您在这里收到错误的原因。

 View view = inflater.inflate(layoutRes, null);

尝试下面的代码,我将列表视图行放在静态内部类中。

    @NonNull
    @Override
      public View getView(int position, @Nullable View convertView,               
      @NonNull ViewGroup parent) {
        final Holder viewHolder;
        if (convertView == null) {

            viewHolder = new Holder();
            convertView = inflater.inflate(layoutRes, null);
            viewHolder.textView = convertView.findViewById(R.id.textViewContactMessage);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (Holder) convertView.getTag();   
        }
        return convertView;
    }
    private static class Holder {
        TextView textView;
    }
}

【讨论】:

  • 第一次使用您的代码可以转到此视图,但是当我在视图中添加某些内容时,当我再次查看应用程序时,应用程序已崩溃。你知道吗???!!!
  • 检查日志,让我知道它在哪里崩溃,然后我可能会帮助你。就像下面的答案建议你应该在构造函数中初始化 LayoutInflater。
  • 我搜索并将我的代码更改为 RecyclerView,它的工作原理很有趣.thnks bro
【解决方案2】:

尝试在构造函数中初始化您的布局充气器,而不是在getView()

LayoutInflater inflater;
public ContactsAdapter(Context mCtx, int layoutRes, List<Contacts> 
                   contactsList)
       {
    super(mCtx, layoutRes, contactsList);

    this.mCtx = mCtx ;
    this.layoutRes = layoutRes ;
    this.contactsList = contactsList ;
    inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

getView() 中,扩充你的布局

view = inflater.inflate(layoutRes, null);

您还必须按照@Padmini S 的建议使用视图支架

【讨论】:

    猜你喜欢
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多