簡體   English   中英

如何從RecyclerView Adapter傳遞給MainActivity的變量?

[英]How can I get a variable from RecyclerView Adapter passed to MainActivity?

當我遇到這個問題時,我只是在玩弄一些代碼,學習新東西...我試圖將RecylcerViewAdapter中的變量傳遞給MainActivity中的方法,但似乎無法完成。

我用接口和強制轉換嘗試了很多不同的方法,但是沒有成功。 由於我對所有這些都還比較陌生,所以也許我在某個地方犯了一個小錯誤?

我的界面:

public interface AdapterCallback {
    void onMethodCallback(int id);
} 

這是我的適配器類:

public class PostAdapter extends RecyclerView.Adapter<PostAdapter.ViewHolder> {

    private List<Post> postList;
    private Context context;
    private AdapterCallback listener;

    public PostAdapter() {
    }

    public PostAdapter(List<Post> postList, Context context) {
        this.postList = postList;
        this.context = context;
    }

    public void setListener(AdapterCallback listener) {
        this.listener = listener;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycler_layout, viewGroup, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int position) {
        viewHolder.tvTitle.setText(postList.get(position).getTitle());
        viewHolder.tvBody.setText(new StringBuilder(postList.get(position).getBody().substring(0, 20)).append("..."));
        viewHolder.tvId.setText(String.valueOf(postList.get(position).getUserId()));

        viewHolder.parentLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int id = postList.get(position).getId();
                if (listener != null) {
                    listener.onMethodCallback(id);
                }
            }
        });
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView tvTitle;
        TextView tvBody;
        TextView tvId;
        LinearLayout parentLayout;

        public ViewHolder(View itemView) {
            super(itemView);

            tvTitle = itemView.findViewById(R.id.tvTitle);
            tvBody = itemView.findViewById(R.id.tvBody);
            tvId = itemView.findViewById(R.id.tvId);
            parentLayout = itemView.findViewById(R.id.parentLayout);
        }
    }
}
And my MainActivity:

public class MainActivity extends AppCompatActivity {

    public static final String TAG = "MainActivityLog";
    private CompositeDisposable disposable = new CompositeDisposable();

    @BindView(R.id.rvPosts)
    RecyclerView rvPosts;

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

        ButterKnife.bind(this);

        rvPosts.setHasFixedSize(true);
        rvPosts.setLayoutManager(new LinearLayoutManager(this));

        populateList();
        logItems();
    }

    private void populateList() {
        MainViewModel viewModel = ViewModelProviders.of(MainActivity.this).get(MainViewModel.class);
        viewModel.makeQuery().observe(MainActivity.this, new Observer<List<Post>>() {
            @Override
            public void onChanged(@Nullable List<Post> posts) {
                PostAdapter adapter = new PostAdapter(posts, getApplicationContext());
                rvPosts.setAdapter(adapter);
            }
        });
    }

    public void logItems() {
        PostAdapter adapter = new PostAdapter();
        adapter.setListener(new AdapterCallback() {
            @Override
            public void onMethodCallback(int id) {
                MainViewModel viewModel = ViewModelProviders.of(MainActivity.this).get(MainViewModel.class);
                viewModel.makeSingleQuery(id).observe(MainActivity.this, new Observer<Post>() {
                    @Override
                    public void onChanged(@Nullable final Post post) {
                        Log.d(TAG, "onChanged: data response");
                        Log.d(TAG, "onChanged: " + post);
                    }
                });
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        disposable.clear();
    }
}

populateList()方法工作得很好,但是logItems()方法是問題所在。

因此,當我在RecyclerView中單擊視圖時,我希望日志輸出被單擊的帖子的標題,描述和ID。 沒事...

因此,任何幫助將不勝感激。

將適配器設為全局變量,即字段。 使用同一對象設置每個屬性。

private PostAdapter adapter;

將此替換為logItems方法:

public void logItems() {
    adapter.setListener(new AdapterCallback() {
        @Override
        public void onMethodCallback(int id) {
            MainViewModel viewModel = ViewModelProviders.of(MainActivity.this).get(MainViewModel.class);
            viewModel.makeSingleQuery(id).observe(MainActivity.this, new Observer<Post>() {
                @Override
                public void onChanged(@Nullable final Post post) {
                    Log.d(TAG, "onChanged: data response");
                    Log.d(TAG, "onChanged: " + post);
                }
            });
        }
    });
}

和populateList與此:

private void populateList() {
    MainViewModel viewModel = ViewModelProviders.of(MainActivity.this).get(MainViewModel.class);
    viewModel.makeQuery().observe(MainActivity.this, new Observer<List<Post>>() {
        @Override
        public void onChanged(@Nullable List<Post> posts) {
            adapter = new PostAdapter(posts, getApplicationContext());
            rvPosts.setAdapter(adapter);
            logItems();
        }
    });
}

而且不要從onCreate調用logItems()

onPopulateList您可以創建一個適配器:

 PostAdapter adapter = new PostAdapter(posts, getApplicationContext());
            rvPosts.setAdapter(adapter);

但是,在public void logItems() {您使用了其他適配器

 PostAdapter adapter = new PostAdapter();
    adapter.setListener(new AdapterCallback() {
        @Override
        public void onMethodCallback(int id) {
            ...
        }
    });

因此,將使用1個適配器填充該列表,但是您將在未使用的第二個適配器上設置偵聽器。


解決方法是對兩個適配器使用相同的適配器。 如果將adapater設置為一個字段,並且不要在logItems內創建一個新字段,而只需設置您的監聽器即可。

 // as a field in your class
 private PostAdapter adapter;

然后

 // in `populateList()` 
 adapter = new PostAdapter(posts, getApplicationContext());
 rvPosts.setAdapter(adapter);

 // in `logItems()`
 adapter.setListener(new AdapterCallback() {
    @Override
    public void onMethodCallback(int id) {
        ...
    }
});

這是我使用ListAdapters實現的方式:

public class FeedbackListAdapter extends RecyclerView.Adapter<FeedbackListAdapter.ViewHolder> {

private final ArrayList<Feedback> feedbacks;
private View.OnClickListener  onItemClickListener;
private View.OnLongClickListener onItemLongClickListener;
private final Context context;

public FeedbackListAdapter(ArrayList<Feedback> feedbacks, Context context) {
    this.feedbacks = feedbacks;
    this.context = context;
}

public void setItemClickListener(View.OnClickListener onItemClickListener) {
    this.onItemClickListener = onItemClickListener;
}

public void setOnItemLongClickListener(View.OnLongClickListener onItemLongClickListener){
    this.onItemLongClickListener = onItemLongClickListener;
}

public class ViewHolder extends RecyclerView.ViewHolder{
    final TextView feedback, created, updated;
    final LinearLayout mainLayout;

    ViewHolder(View iv) {
        super(iv);
        /*
         * Associate layout elements to Java declarations
         * */

        mainLayout = iv.findViewById(R.id.main_layout);
        feedback = iv.findViewById(R.id.feedback);
        created = iv.findViewById(R.id.created_string);
        updated = iv.findViewById(R.id.updated_string);
    }
}

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

@Override
@NonNull
public FeedbackListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_feedback_table_row, parent, false);
    return new FeedbackListAdapter.ViewHolder(view);
}

@Override
public void onBindViewHolder(final @NonNull FeedbackListAdapter.ViewHolder holder, final int position) {
    /*
     * Bind data to layout
     * */
    try{
        Feedback feedback = feedbacks.get(position);

        holder.feedback.setText(feedback.getContent());
        holder.created.setText(feedback.getCreated());
        holder.updated.setText(feedback.getUpdated());

        holder.mainLayout.setOnClickListener(this.onItemClickListener);
        holder.mainLayout.setOnLongClickListener(this.onItemLongClickListener);
        holder.mainLayout.setTag(feedback.getDbID());

        TypedValue outValue = new TypedValue();
        context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
        holder.mainLayout.setBackgroundResource(outValue.resourceId);

    }catch(IndexOutOfBoundsException e){
        e.printStackTrace();
    }
}

}

在適配器中

public class CustomerListAdapter extends RecyclerView.Adapter<CustomerListAdapter.OrderItemViewHolder> {

    private Context mCtx;
    ProgressDialog progressDialog;

    //we are storing all the products in a list
    private List<CustomerModel> customeritemList;


    public CustomerListAdapter(Context mCtx, List<CustomerModel> orderitemList) {
        this.mCtx = mCtx;
        this.customeritemList = orderitemList;
        progressDialog = new ProgressDialog(mCtx);
    }

    @NonNull
    @Override
    public OrderItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        LayoutInflater inflater = LayoutInflater.from(mCtx);
        View view = inflater.inflate(R.layout.activity_customer_list, null);
        return new OrderItemViewHolder(view, mCtx, customeritemList);
    }

    @Override
    public void onBindViewHolder(@NonNull OrderItemViewHolder holder, int position) {
        CustomerModel customer = customeritemList.get(position);
        try {
            //holder.textViewPINo.setText("PINo \n"+Integer.toString( order.getPINo()));
            holder.c_name.setText(customer.getCustomerName());
            holder.c_address.setText(customer.getAddress());
            holder.c_contact.setText(customer.getMobile());
            holder.i_name.setText(customer.getInteriorName());
            holder.i_contact.setText(customer.getInteriorMobile());
            holder.i_address.setText(customer.getAddress());

        } catch (Exception E) {
            E.printStackTrace();
        }
    }


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

    class OrderItemViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener, View.OnClickListener {
        AlertDialog.Builder alert;
        private Context mCtx;

        TextView c_name, c_contact, c_address, i_name, i_contact, i_address;
        TextView OrderItemID, MaterialType, Price2, Qty, AQty;

        //we are storing all the products in a list
        private List<CustomerModel> orderitemList;


        public OrderItemViewHolder(View itemView, Context mCtx, List<CustomerModel> orderitemList) {
            super(itemView);
            this.mCtx = mCtx;
            this.orderitemList = orderitemList;

            itemView.setOnClickListener(this);
            itemView.setOnLongClickListener(this);

            // CatelogOrderDetailModel catelogOrderDetailModel = new CatelogOrderDetailModel();
            c_name = itemView.findViewById(R.id.customerName);
            c_contact = itemView.findViewById(R.id.contact);
            c_address = itemView.findViewById(R.id.address);
            i_name = itemView.findViewById(R.id.interiorName);
            i_address = itemView.findViewById(R.id.interiorAddress);
            i_contact = itemView.findViewById(R.id.interiorContact);
        }

        @Override
        public void onClick(View v) {
            int position = getAdapterPosition();
            CustomerModel orderitem = this.orderitemList.get(position);

        }

        @Override
        public boolean onLongClick(View v) {

            int position = getAdapterPosition();
            CustomerModel orderitem = this.orderitemList.get(position);

            if (v.getId() == itemView.getId()) {
                // showUpdateDeleteDialog(order);
                try {

                } catch (Exception E) {
                    E.printStackTrace();
                }
                Toast.makeText(mCtx, "lc: ", Toast.LENGTH_SHORT).show();
            }
            return true;
        }


    }
}

暫無
暫無

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

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