【问题标题】:RecyclerView doesn't add EditText until second time it's clicked? (notifyDataSetChanged?)RecyclerView 直到第二次被点击才添加 EditText? (notifyDataSetChanged?)
【发布时间】:2017-11-22 06:05:49
【问题描述】:

目标:使用 RecyclerView 将 EditText 字段添加到 Activity

发生了什么:我希望在单击“添加”按钮时将带有 ImageView 和 EditText 的 LinearLayouts(horizo​​ntal) 添加到屏幕上。他们直到我才出现:

-1)在edittext字段中输入并点击完成

-2) 点击添加

-3) 点击我已经输入的EditText字段,然后再次点击完成,或者点击关闭

它应该在第 2 步之后添加,而不是第 3 步。我的想法是它与 notifyDataSetChanged 有关,但我不确定是什么?

研究完成:过去几天浏览了文档、教程、youtube 视频和 stackoverflow 搜索

测试完成:尝试移动我调用 notifyDataSetChanged() 的方法的位置; 尝试更改布局的尺寸 尝试更改输入类型

MyAdapter.java:

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.LinearLayout;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
    private ArrayList<LinearLayout> mDataSet;
    private Context mContext;
    private Random mRandom = new Random();


    public MyAdapter(Context context){

        mContext = context;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder{
        public EditText mTextEditName, mTextEditLocation;
        public LinearLayout mRelativeLayout; //from the (Main)Activity XML
        public ViewHolder(View v){
            super(v);
            mTextEditName = (EditText) v.findViewById(R.id.nameOfBusinessET);

            mRelativeLayout = (LinearLayout) v.findViewById(R.id.rl);
        }
    }

    void updateDataSet(ArrayList<LinearLayout> myArrayList) {
        mDataSet = myArrayList;
        notifyDataSetChanged();
    }

    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
        // Create a new View
        View v = LayoutInflater.from(mContext).inflate(R.layout.row_layout,parent,false);
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        holder.mTextEditName.setText("");

    }       

    @Override
    public int getItemCount(){
        return mDataSet.size();
    }

}

RegisterBusinessActivity.java:

public class RegisterBusinessActivity extends Activity {

    EditText businessLocationET;

    //FIREBASE ITEMS
    private static FirebaseUser currentUser;
    private static final String TAG = "RealtimeDB";
    private FirebaseDatabase database;
    private DatabaseReference dbRef;
    private EditText businessName;

    //RECYCLERVIEW ITEMS
    private Context mContext;
    LinearLayout mLinearLayout;
    private RecyclerView mRecyclerView;
    private MyAdapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    int position;
    ArrayList<LinearLayout> linearLayoutList = new ArrayList<LinearLayout>();

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

        Button addLocationBtn = (Button) findViewById(R.id.addLocationBtn);
        businessLocationET = (EditText) findViewById(R.id.businessLocationET);


        // Get the widgets reference from XML layout
        mLinearLayout = (LinearLayout) findViewById(R.id.rl);
        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);

        mContext = getApplicationContext(); // Get the application context
        linearLayoutList.add(mLinearLayout);

        // Define a layout for RecyclerView
        mLayoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false);
        mRecyclerView.setLayoutManager(mLayoutManager);
        // Initialize a new instance of RecyclerView Adapter instance
        mAdapter = new MyAdapter(mContext);

        // Set the adapter for RecyclerView
        mRecyclerView.setAdapter(mAdapter);
        mAdapter.updateDataSet(linearLayoutList);


        //FIREBASE FIELDS
        businessName = (EditText) findViewById(R.id.nameOfBusinessET);
        database = FirebaseDatabase.getInstance();
        dbRef = database.getReference("/data");
        currentUser =
                FirebaseAuth.getInstance().getCurrentUser();            



        //ADD EXTRA LOCATIONS
        addLocationBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                linearLayoutList.add(mLinearLayout);
            }
        });


    DatabaseReference.CompletionListener completionListener =
            new DatabaseReference.CompletionListener() {
                @Override
                public void onComplete(DatabaseError databaseError,
                                       DatabaseReference databaseReference) {

                    if (databaseError != null) {
                        notifyUser(databaseError.getMessage());
                    }
                }
            };


    private void notifyUser(String message) {
        Toast.makeText(RegisterBusinessActivity.this, message,
                Toast.LENGTH_SHORT).show();
    }


}

【问题讨论】:

    标签: java android android-recyclerview notifydatasetchanged


    【解决方案1】:

    在“添加”点击事件之后,您似乎没有更新您的回收站。您只需将项目添加到列表中,而无需更新适配器/回收器视图。

    一个选项就是使用您添加的特定位置:

    mAdapter.notifyItemInserted(yourItems.size() - 1);
    

    或比使用更好:

    mAdapter.notifyDataSetChanged();
    

    所以它看起来像这样:

    addLocationBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    linearLayoutList.add(mLinearLayout);
                    mAdapter.updateDataSet(linearLayoutList);
                }
     });
    

    【讨论】:

    • 嗨 motis10:我的 RegisterBusinessActivity.java 中有 mAdapter.updateDataSet(linearLayoutList) .... 你是说还要将它添加到 onClick 中吗?还是仅仅在 onClick 中?
    • 所以添加它们,但顺序是奇数。我在第一个中输入“test1”,然后单击添加。我在第二个中输入“test2”,然后单击“添加”。第三个超过 1 和 2,所以当我在其中输入“test3”时,它从上到下显示为 test3、test1、test2
    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 2021-08-22
    相关资源
    最近更新 更多