Обновите Recyclerview с помощью нового SMS

#java #android-studio #android-recyclerview #sms

#java #android-studio #android-recyclerview #sms

Вопрос:

Я работаю над приложением SMS, которое почти завершено, но у меня возникли проблемы с обновлением Recyclerview с помощью нового SMS, новое SMS не отображается в списке, пока я не закрою и не открою свое приложение. Я перепробовал много решений, но я не могу заставить его работать, пожалуйста, помогите Заранее Спасибо, мой ConverstaionDetailsItemAdapter.javaкласс, в котором я расширяю Recyvlerview.Адаптер

     public class ConverstaionDetailsItemAdapter extends 
    RecyclerView.Adapter<ConversationDetailsItemViewHolder> {
    Conversation conversation;
    List<Message> messages;
    Context mContext;

    public List<Message> getMessages() {
    return messages;
    }

    public void setMessages(List<Message> messages) {
    this.messages = messages;
    }

    public ConverstaionDetailsItemAdapter(List<Message> pMessages, Context context, Conversation 
 pConversation) {
    this.messages = pMessages;
    mContext = context;
    this.conversation = pConversation;

}

@Override
public ConversationDetailsItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new ConversationDetailsItemViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_conversations_details_item, parent, false), mContext,conversation);
}

@Override
public void onBindViewHolder(final ConversationDetailsItemViewHolder holder, final int position) {
    Message message = messages.get(position);
    if (message != null) {
        holder.setConversationItem(message, position);
    }
}

@Override

public int getItemCount() {
    return (messages == null) ? 0 : messages.size();
}

@Override
public int getItemViewType(int position) {
    return position;
}
    }
 

Мой класс ViewHolder

     public class ConversationDetailsItemViewHolder extends RecyclerView.ViewHolder {

Context mContext;
Conversation conversation;
ImageView imageView;
public static TextView txtContactName, txtMessage, txtMessageTime;
private RelativeLayout rltRoot;


public ConversationDetailsItemViewHolder(View view, Context context, Conversation pConversation) {
    super(view);
    mContext = context;
    conversation = pConversation;
    rltRoot = view.findViewById(R.id.rlt_conversation_details_item_root);
    txtContactName = view.findViewById(R.id.txt_contact_name);
    txtMessageTime = view.findViewById(R.id.text_message_time);
    txtMessage = view.findViewById(R.id.text_message);
}

public void setConversationItem(Message item, final int position) {
    if(item.getType().equals("1")) {
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        txtMessage.setLayoutParams(params);
        txtMessage.setBackgroundResource(R.drawable.rounded_rectangle_incoming);
    
    } else {
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        txtMessage.setLayoutParams(params);

        txtMessage.setBackgroundResource(R.drawable.rounded_rectangle);
    }
    txtMessage.setText(item.getBody() "n");

}
}
 

Ответ №1:

У меня есть аналогичный проект, посмотрите мой код

 package com.example.crimerigestration;

import android.app.ActionBar;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.view.menu.MenuView;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class CrimeListFragment extends Fragment {



private boolean mSubtitleVisible;

private RecyclerView mCrimeRecyclerView;
private CrimeAdapter crimeAdapter;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup 
container, @Nullable Bundle savedInstanceState) {
    View v= inflater.inflate(R.layout.fragment_list_crime,container,false);

    mCrimeRecyclerView=(RecyclerView)v.findViewById(R.id.crime_recycler_view);
    mCrimeRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    setHasOptionsMenu(true);
    updateUI();
    return v;
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.fragment_crime_list,menu);
    MenuItem menuItem=menu.findItem(R.id.show_subtitle);
    if(mSubtitleVisible){
        menuItem.setTitle(R.string.hide_subtitle);
    }
    else {
        menuItem.setTitle(R.string.show_subtitle);
    }

}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    //return super.onOptionsItemSelected(item);
    switch (item.getItemId()){
        case R.id.new_crime:
            Crime crime=new Crime();
            CrimeLab.get(getActivity()).addCrime(crime);
            Intent intent=CrimePagerActivity.newIntent(getActivity(),crime.getmID());
            startActivity(intent);
            return true;
        case R.id.show_subtitle:
            mSubtitleVisible=!mSubtitleVisible;
            getActivity().invalidateOptionsMenu();
            updateSubtitle();
            return true;
        default:
                return super.onOptionsItemSelected(item);


    }
}


private void updateSubtitle() {
    String subtitle=null;
    if(mSubtitleVisible){
        CrimeLab crimeLab=CrimeLab.get(getActivity());
        int count=crimeLab.getsCrimes().size();
        subtitle=getString(R.string.subtitle_formate,count);
    }
    AppCompatActivity appCompatActivity=(AppCompatActivity)getActivity();
    appCompatActivity.getSupportActionBar().setSubtitle(subtitle);
}

@Override
public void onResume() {
    super.onResume();
    updateUI();
}

private void updateUI() {
    CrimeLab crimeLab=CrimeLab.get(getActivity());
    ArrayList<Crime> crimes=crimeLab.getsCrimes();
    if (crimeAdapter==null){
        crimeAdapter =new CrimeAdapter(crimes);
        mCrimeRecyclerView.setAdapter(crimeAdapter);
    }
    else {
        crimeAdapter.setCrimes(crimes);
        crimeAdapter.notifyDataSetChanged();
    }

}



private class CrimeHolder extends RecyclerView.ViewHolder implements 
View.OnClickListener {

    private TextView mTitleTextView, mDateTextView;
    private ImageView mSolvedImageView;
    private Crime mCrime;

    public CrimeHolder(LayoutInflater inflater, ViewGroup parent) {
        super(inflater.inflate(R.layout.list_item_crime,parent,false));
        mTitleTextView=(TextView) itemView.findViewById(R.id.crime_title);
        mDateTextView=(TextView)itemView.findViewById(R.id.crime_date);
        mSolvedImageView=(ImageView)itemView.findViewById(R.id.imageView);

        itemView.setOnClickListener(this);
    }
    public void bind(Crime crime){
        this.mCrime=crime;
        mTitleTextView.setText(mCrime.getmTitle());
        mDateTextView.setText(mCrime.getmDate().toString());
        mSolvedImageView.setVisibility(mCrime.ismSolved()?View.VISIBLE:View.GONE);
    }

    @Override
    public void onClick(View v) {

        Intent intent=CrimePagerActivity.newIntent(getActivity(),mCrime.getmID());
        startActivity(intent);
    }
}



private class RequireCrimeHolder extends RecyclerView.ViewHolder implements 
View.OnClickListener {

    private TextView mTitleTextView, mDateTextView;
    private ImageView mSolvedImageView;
    private Button mRequireButton;
    private Crime mCrime;

    public RequireCrimeHolder(LayoutInflater inflater, ViewGroup parent) {
        super(inflater.inflate(R.layout.requried_to_police,parent,false));
        mTitleTextView=(TextView) itemView.findViewById(R.id.crime_title);
        mDateTextView=(TextView)itemView.findViewById(R.id.crime_date);
        mSolvedImageView=(ImageView)itemView.findViewById(R.id.imageView);
        mRequireButton=(Button)itemView.findViewById(R.id.button);
        Factory();
        itemView.setOnClickListener(this);
    }
    protected void Factory(){
        mRequireButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(),"No functionality 
available",Toast.LENGTH_LONG).show();
            }
        });
    }
    public void bind(Crime crime){
        this.mCrime=crime;
        mTitleTextView.setText(mCrime.getmTitle());
        mDateTextView.setText(mCrime.getmDate().toString());
        mSolvedImageView.setVisibility(mCrime.ismSolved()?View.VISIBLE:View.GONE);
    }

    @Override
    public void onClick(View v) {
        Intent intent=CrimePagerActivity.newIntent(getActivity(),mCrime.getmID());
        startActivity(intent);        }
}


private class CrimeAdapter extends RecyclerView.Adapter{

    private ArrayList<Crime> mCrime;

    public CrimeAdapter(ArrayList<Crime> mCrime) {
        this.mCrime = mCrime;
    }

    @Override
    public int getItemViewType(int position) {
        if (mCrime.get(position).ismRequire() ){
            return 0;
        }
        else{
            return 1;
        }
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int 
viewType) {
        LayoutInflater layoutInflater=LayoutInflater.from(getActivity());
        if (viewType==0){
            return new RequireCrimeHolder(layoutInflater,parent);
        }
        else{
            return new CrimeHolder(layoutInflater,parent);
        }

    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int 
position) {
        Crime crime=mCrime.get(position);
        if (crime.ismRequire() ){
            RequireCrimeHolder requireCrimeHolder= (RequireCrimeHolder) holder;
            requireCrimeHolder.bind(crime);
        }
        else{
            CrimeHolder crimeHolder= (CrimeHolder) holder;
            crimeHolder.bind(crime);
        }
    }

    @Override
    public int getItemCount() {
        return mCrime.size();
    }
    public void setCrimes(ArrayList<Crime> crime){
        this.mCrime=crime;
    }
}
}
 

Ответ №2:

Вы должны вызвать notifyItemInsert(0) (или size — 1, вместо 0, в зависимости от сортировки asc / desc). Если это не сработает, попробуйте notifyDataSetChanged() , но не сохраняйте его, потому что это снизит производительность.