当我滚动项目时,Recycler视图会交换项目

时间:2018-09-03 11:41:21

标签: android android-recyclerview

我正在开发chatbot应用。我正在使用RecycleView来呈现用户和机器人的聊天记录。我必须显示用户列表视图或文本响应取决于他的查询。一切正常,直到RecyclerView滚动为止。每当我的RecyclerView滚动时,它都会更改项目位置。我进行了很多搜索并使用了每种解决方案,但无法解决我的问题。

这是我的活动。java

public class HomeActivity extends AppCompatActivity implements AIListener, 
View.OnClickListener {

private RecyclerView recyclerView;
private ChatAdapter mAdapter;
LinearLayoutManager layoutManager;
private ArrayList<Message> messageArrayList;
private EditText inputMessage;
private RelativeLayout btnSend;
Boolean flagFab = true;
PaytmPGService service = null;
Map<String, String> paytmparam = new HashMap<>();
PrefManager prefManager;
private AIService aiService;
AIDataService aiDataService;
AIRequest aiRequest;
Gson gson;
String food_dish = " ";
double price = 0;


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

    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 1);

    inputMessage = findViewById(R.id.editText_ibm);
    btnSend = findViewById(R.id.addBtnibm);

    recyclerView = findViewById(R.id.recycler_view_ibm);

    messageArrayList = new ArrayList<>();
    mAdapter = new ChatAdapter(this,messageArrayList);

    prefManager = new PrefManager(this);

    GsonBuilder gsonBuilder = new GsonBuilder();
    gson = gsonBuilder.create();

    layoutManager = new LinearLayoutManager(this);
    layoutManager.setStackFromEnd(true);

    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setHasFixedSize(true);
    recyclerView.setItemAnimator(new DefaultItemAnimator());

    mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            super.onItemRangeInserted(positionStart, itemCount);

            int msgCount = mAdapter.getItemCount();
            int lastVisiblePosition = layoutManager.findLastCompletelyVisibleItemPosition();

            if (lastVisiblePosition == -1 ||
                    (positionStart >= (msgCount - 1) &&
                            lastVisiblePosition == (positionStart - 1))) {
                recyclerView.scrollToPosition(positionStart);

            }

        }
    });

    recyclerView.setAdapter(mAdapter);
    this.inputMessage.setText("");

    final AIConfiguration configuration = new AIConfiguration("cabc4b7b9c20409aa7ffb1b3d5fe1243",
            AIConfiguration.SupportedLanguages.English,
            AIConfiguration.RecognitionEngine.System);

    aiService = AIService.getService(this, configuration);
    aiService.setListener(this);

    aiDataService = new AIDataService(configuration);

    aiRequest = new AIRequest();

    btnSend.setOnClickListener(this);

    inputMessage.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            ImageView fab_img = findViewById(R.id.fab_img_ibm);
            Bitmap img = BitmapFactory.decodeResource(getResources(), R.drawable.ic_send_white_24dp);
            Bitmap img1 = BitmapFactory.decodeResource(getResources(), R.drawable.ic_mic_white_24dp);


            if (s.toString().trim().length() != 0 && flagFab) {
                ImageViewAnimatedChange(HomeActivity.this, fab_img, img);
                flagFab = false;

            } else if (s.toString().trim().length() == 0) {
                ImageViewAnimatedChange(HomeActivity.this, fab_img, img1);
                flagFab = true;

            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

}

public void ImageViewAnimatedChange(Context c, final ImageView v, final Bitmap new_image) {
    final Animation anim_out = AnimationUtils.loadAnimation(c, R.anim.zoom_out);
    final Animation anim_in  = AnimationUtils.loadAnimation(c, R.anim.zoom_in);
    anim_out.setAnimationListener(new Animation.AnimationListener()
    {
        @Override public void onAnimationStart(Animation animation) {}
        @Override public void onAnimationRepeat(Animation animation) {}
        @Override public void onAnimationEnd(Animation animation)
        {
            v.setImageBitmap(new_image);
            anim_in.setAnimationListener(new Animation.AnimationListener() {
                @Override public void onAnimationStart(Animation animation) {}
                @Override public void onAnimationRepeat(Animation animation) {}
                @Override public void onAnimationEnd(Animation animation) {}
            });
            v.startAnimation(anim_in);
        }
    });
    v.startAnimation(anim_out);
}

@Override
public void onClick(View v) {

    final String inputmessage = this.inputMessage.getText().toString().trim();

    if(!inputmessage.equals("")){
        new AsyncTask<String, Void, AIResponse>(){

            private AIError aiError;

            @Override
            protected AIResponse doInBackground(final String... params) {
                final AIRequest request = new AIRequest();
                String query = params[0];


                if (!TextUtils.isEmpty(query))
                    request.setQuery(query);
                try {
                    return aiDataService.request(request);
                } catch (final AIServiceException e) {
                    aiError = new AIError(e);
                    return null;
                }
            }

            @Override
            protected void onPostExecute(final AIResponse response) {
                if (response != null) {
                    onResult(response);
                } else {
                    onError(aiError);
                }
            }
        }.execute(inputmessage);
    }else {
        aiService.startListening();
    }
    inputMessage.setText("");
}

@Override
public void onResult(AIResponse response) {
    int itemNumber = 0;
    Log.d("dialogeflow response",response.toString());
    try {
        JSONObject AIResponse = new JSONObject(gson.toJson(response));
        Log.d("json response",AIResponse.toString());
        final JSONObject result = AIResponse.getJSONObject("result");
        JSONArray contexts = result.getJSONArray("contexts");
        final JSONObject fulfillment = result.getJSONObject("fulfillment");
        if(contexts.length()>0) {
            for(int i = 0;i<contexts.length();i++) {
                JSONObject context_items = contexts.getJSONObject(i);
                JSONObject paramters = context_items.getJSONObject("parameters");
                if (paramters.has("Cuisine")) {
                    prefManager.setCuisinetype(paramters.getString("Cuisine"));
                } else if (paramters.has("Restaurants_name")) {
                    prefManager.setRestaurant_name(paramters.getString("Restaurants_name"));
                }
                if (paramters.has("number") && !paramters.getString("number").equals("") && paramters.has("Food_Dishes") && !paramters.getString("Food_Dishes").equals("")) {
                    itemNumber = Integer.parseInt(paramters.getString("number"));
                    if (itemNumber <= 2 && price !=0) {
                        price = 300 + (int) (Math.random() * ((1400 - 300) + 1));
                    } else {
                        price = 600 + (int) (Math.random() * ((2200 - 600) + 1));
                    }
                    food_dish = paramters.getString("Food_Dishes");
                }
            }
        }
        final double finalPrice = price;
        final int finalItemNumber = itemNumber;
        if(!result.getString("resolvedQuery").matches("payment is done successfully")) {
            Message usermsg = new Message();
            usermsg.setMessage(result.getString("resolvedQuery"));
            usermsg.setId("1");
            messageArrayList.add(usermsg);
            mAdapter.notifyDataSetChanged();
            if (fulfillment.has("speech")) {
                Log.d("response of speech", fulfillment.getString("speech"));
                if (!fulfillment.getString("speech").equals("") && fulfillment.getString("speech") != null) {
                    final String speech = fulfillment.getString("speech");
                    if (fulfillment.getString("speech").matches("Redirecting you to the Pay-Tm site")) {
                        new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                Message outMessage = new Message();
                                outMessage.setMessage(speech);
                                outMessage.setId("2");
                                messageArrayList.add(outMessage);
                                mAdapter.notifyDataSetChanged();
                                getpaytm_params((int) price);
                            }
                        }, 2000);
                    } else {
                        new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                Message outMessage = new Message();
                                if (speech.contains("Your total bill is ₹")) {
                                    Log.d("price", String.valueOf(price));
                                    outMessage.setMessage("Please Confirm your order:- \n" +finalItemNumber +" "+food_dish+" from "+prefManager.getRestaurant_name()+" at Flat No: 20,Galaxy Apartment,Airport Authority Colony,Andheri,Mumbai,Maharashtra 400 047 \n Your total bill is ₹"+price+". \n Do you want to pay by Wallet or by PayTm");
                                }else{
                                    outMessage.setMessage(speech);
                                }
                                outMessage.setId("2");
                                messageArrayList.add(outMessage);
                                Log.d("messgae",outMessage.getMessage());
                                mAdapter.notifyDataSetChanged();
                            }
                        }, 2000);
                    }
                } else {
                    final JSONArray msg = fulfillment.getJSONArray("messages");
                    for (int i = 0; i < msg.length(); i++) {
                        if (i == 0) {
                            Message outMessage = new Message();
                            JSONObject speechobj = msg.getJSONObject(i);
                            JSONArray speech = speechobj.getJSONArray("speech");
                            Log.d("response of speech", speech.getString(0));
                            outMessage.setMessage(speech.getString(0));

                            outMessage.setId("2");
                            messageArrayList.add(outMessage);
                        } else {
                            final int itemposition = i;
                            new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    Message outMessage = new Message();
                                    try {
                                        JSONObject speechobj = msg.getJSONObject(itemposition);
                                        JSONArray speech = speechobj.getJSONArray("speech");
                                        Log.d("response of speech", speech.getString(0));
                                        outMessage.setMessage(speech.getString(0));
                                        outMessage.setId("2");
                                        messageArrayList.add(outMessage);
                                        mAdapter.notifyDataSetChanged();
                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }, 5000);
                        }
                    }
                }
            }
        }else{
            if (!fulfillment.getString("speech").equals("") && fulfillment.getString("speech") != null) {
                final String speech = fulfillment.getString("speech");
                    new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            Message outMessage = new Message();
                            outMessage.setMessage(speech);
                            outMessage.setId("2");
                            messageArrayList.add(outMessage);
                            mAdapter.notifyDataSetChanged();
                        }
                    },2000);
            }
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

@Override
public void onError(AIError error) {

}

@Override
public void onAudioLevel(float level) {

}

@Override
public void onListeningStarted() {
    btnSend.setBackground(getDrawable(R.drawable.recording_bg));
}

@Override
public void onListeningCanceled() {
    btnSend.setBackground(getDrawable(R.drawable.stedy_recording));
}

@Override
public void onListeningFinished() {
    btnSend.setBackground(getDrawable(R.drawable.stedy_recording));
}
}`

我的ChatAdapter.java类

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

private int BOT = 100;
private int BOT_Restaurant_ListView = 101;
private int USER = 102;
private Activity activity;
private PrefManager prefManager;
private int itemposition = -1;
private int menu_itemposition = -1;
private List<Restaurant_List_Model> restaurant_list;
private ArrayList<Message> messageArrayList;
private RestaurantListViewAdapter restaurantListViewAdapter;
private TextToSpeech tts ;

public ChatAdapter(Activity activity, ArrayList<Message> messageArrayList) {
    this.activity = activity;
    this.messageArrayList = messageArrayList;
    tts = new TextToSpeech(activity, new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if(status != TextToSpeech.ERROR){
                tts.setLanguage(Locale.ENGLISH);
            }
        }
    });
    prefManager = new PrefManager(activity.getApplicationContext());
    setHasStableIds(true);
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View itemview;

    if(viewType == BOT){
        itemview = LayoutInflater.from(parent.getContext()).inflate(R.layout.bot_msg_view,parent,false);
    }else if(viewType == BOT_Restaurant_ListView){
        itemview = LayoutInflater.from(parent.getContext()).inflate(R.layout.bot_msg_restaurant_listview,parent,false);
    }else {
        itemview = LayoutInflater.from(parent.getContext()).inflate(R.layout.user_msg_view,parent,false);
    }

    return new ViewHolder(itemview);
}

@Override
public int getItemViewType(int position) {
    Message message = messageArrayList.get(position);
    if(message.getId()!=null && message.getId().equals("2")){
        if(message.getMessage().contains("restaurants") || message.getMessage().contains("restaurant")) {
            return BOT_Restaurant_ListView;
        }else {
            return BOT;
        }
    }else{
        return USER;
    }
}

@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) {
    int pic_int = 1;
    String filename = null;
    final Message message = messageArrayList.get(position);
    message.setMessage(message.getMessage());
    if (holder.getItemViewType() == BOT_Restaurant_ListView) {
        Log.d("inside bot listview msg", String.valueOf(BOT_Restaurant_ListView ));
        Log.d("adapter position", String.valueOf(holder.getAdapterPosition()));
        if(itemposition<holder.getAdapterPosition()){
            itemposition = holder.getAdapterPosition();
            Log.d("itemposition",String.valueOf(itemposition));
            String jsonFileContent;
            Log.d("cuisine value", prefManager.getCuisinetype());
            if (message.getMessage().contains("restaurants")) {
                if(!prefManager.getCuisinetype().equals("") && prefManager.getCuisinetype() != null){
                    Log.d("restauratn has drawn", "greate");
                    try {
                        restaurant_list = new ArrayList<>();
                        restaurantListViewAdapter = new RestaurantListViewAdapter(activity, restaurant_list);
                        ((ViewHolder) holder).retaurant_listView.setVisibility(View.VISIBLE);
                        ((ViewHolder) holder).retaurant_listView.setAdapter(restaurantListViewAdapter);
                        Log.d("cuisine value", prefManager.getCuisinetype());
                        if(message.getMessage().contains("Here are restaurants near you")){
                            String [] restaurant_Array ={
                                    "indian","french","mexican","italian"
                            };
                            int randomNumber = (int) Math.floor(Math.random()*restaurant_Array.length);
                            filename = restaurant_Array[randomNumber];
                            Log.d("filename",filename);
                            jsonFileContent = readFile(activity.getResources().getIdentifier(filename, "raw", activity.getPackageName()));
                        }else {
                            filename = prefManager.getCuisinetype().toLowerCase() + "_restaurants";
                            Log.d("filename", filename);
                            jsonFileContent = readFile(activity.getResources().getIdentifier(filename, "raw", activity.getPackageName()));
                        }
                        JSONObject restaurantfile = new JSONObject(jsonFileContent);
                        JSONArray jsonArray = restaurantfile.getJSONArray("restaurants");
                        for (int i = 0; i < jsonArray.length(); i++) {
                            ImageRoundCorner imageRoundCorner = new ImageRoundCorner();
                            JSONObject restaurantList = jsonArray.getJSONObject(i);
                            Restaurant_List_Model restaurant_list_obj = new Restaurant_List_Model();
                            restaurant_list_obj.setName(restaurantList.getString("name"));
                            restaurant_list_obj.setLocation(restaurantList.getString("location"));
                            restaurant_list_obj.setImage_of_item(imageRoundCorner.getRoundedCornerBitmap(BitmapFactory.decodeResource(activity.getResources(), activity.getResources().getIdentifier("restaurant_" + pic_int, "drawable", activity.getPackageName()))));
                            pic_int++;
                            restaurant_list_obj.setRating(restaurantList.getLong("rating"));

                            restaurant_list.add(restaurant_list_obj);
                        }

                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            tts.speak(message.getMessage(), TextToSpeech.QUEUE_FLUSH, null, null);
                        } else {
                            tts.speak(message.getMessage(), TextToSpeech.QUEUE_FLUSH, null);
                        }
                        prefManager.setCuisinetype("");
                        pic_int = 1;
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    restaurantListViewAdapter.notifyDataSetChanged();
                }


            }else if(message.getMessage().contains("Here are some famous food items from "+prefManager.getRestaurant_name()+" restaurant")){
                try {
                    Log.d("menu has draw","greate");
                    restaurant_list = new ArrayList<>();
                    restaurantListViewAdapter = new RestaurantListViewAdapter(activity, restaurant_list);
                    ((ViewHolder) holder).retaurant_listView.setAdapter(restaurantListViewAdapter);
                    ((ViewHolder) holder).retaurant_listView.setVisibility(View.VISIBLE);
                    Log.d("restaurant name value", prefManager.getRestaurant_name());
                    jsonFileContent = readFile(R.raw.restaurant_menu);
                    JSONObject menu_cuisine = new JSONObject(jsonFileContent);
                    ImageRoundCorner imageRoundCorner = new ImageRoundCorner();
                    if (menu_cuisine.has(prefManager.getRestaurant_name())) {
                        JSONObject restaurant_menu = menu_cuisine.getJSONObject("Dominos");
                        Log.d("Chili's American menu", restaurant_menu.toString());
                        JSONArray menu = restaurant_menu.getJSONArray("menu");
                        for (int j = 0; j < menu.length(); j++) {
                            JSONObject menu_obj = menu.getJSONObject(j);
                            Restaurant_List_Model restaurant_list_obj = new Restaurant_List_Model();
                            restaurant_list_obj.setName(menu_obj.getString("name"));
                            restaurant_list_obj.setLocation(menu_obj.getString("cuisine_type"));
                            restaurant_list_obj.setImage_of_item(imageRoundCorner.getRoundedCornerBitmap(BitmapFactory.decodeResource(activity.getResources(), activity.getResources().getIdentifier("menu_" + pic_int, "drawable", activity.getPackageName()))));
                            //restaurant_list_obj.setImage_of_item(imageRoundCorner.getRoundedCornerBitmap(BitmapFactory.decodeResource(activity.getResources(), activity.getResources().getIdentifier("menu_" + pic_int, "drawable", activity.getPackageName()))));
                            pic_int++;
                            restaurant_list_obj.setRating(menu_obj.getLong("rating"));
                            restaurant_list.add(restaurant_list_obj);
                        }
                        restaurantListViewAdapter.notifyDataSetChanged();
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            tts.speak(message.getMessage(), TextToSpeech.QUEUE_FLUSH, null, null);
                        } else {
                            tts.speak(message.getMessage(), TextToSpeech.QUEUE_FLUSH, null);
                        }
                        pic_int = 1;
                        prefManager.setRestaurant_name("");
                    }
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        Log.d("user_message",message.getMessage());
                        tts.speak(message.getMessage(), TextToSpeech.QUEUE_FLUSH, null, null);
                    }else {
                        tts.speak(message.getMessage(), TextToSpeech.QUEUE_FLUSH, null);
                    }
                    pic_int = 1;
                } catch (JSONException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            ((ViewHolder) holder).retaurant_listView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    int action = event.getAction();
                    switch (action) {
                        case MotionEvent.ACTION_DOWN:
                            v.getParent().requestDisallowInterceptTouchEvent(true);
                            break;

                        case MotionEvent.ACTION_UP:
                            v.getParent().requestDisallowInterceptTouchEvent(false);
                            break;
                    }
                    v.onTouchEvent(event);
                    return true;
                }
            });
        }
    } if(holder.getItemViewType()==BOT) {
        Log.d("adapter position", String.valueOf(holder.getAdapterPosition()));
        Log.d("inside bot msg", String.valueOf(BOT));
            ((ViewHolder) holder).bot_msg.setText(message.getMessage());
            if(itemposition<holder.getAdapterPosition()) {
                itemposition = holder.getAdapterPosition();
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    tts.speak(message.getMessage(), TextToSpeech.QUEUE_FLUSH, null, null);
                } else {
                    tts.speak(message.getMessage(), TextToSpeech.QUEUE_FLUSH, null);
                }
            }
    }if(holder.getItemViewType() == USER) {
        ((ViewHolder) holder).user_message.setText(message.getMessage());
    }
}

@Override
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
    super.onViewRecycled(holder);
    if(holder.isRecyclable()){
        Log.d("inside onViewRecycled","great");
       // itemposition = holder.getAdapterPosition();
    }
}

@Override
public long getItemId(int position) {
    return super.getItemId(position);
}

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

private String readFile(int id) throws IOException
{
    BufferedReader reader = null;
    reader = new BufferedReader(new InputStreamReader(activity.getResources().openRawResource(id)));

    String content = "";
    String line;
    while ((line = reader.readLine()) != null)
    {
        content = content + line;
    }

    return content;

}

public class ViewHolder extends RecyclerView.ViewHolder{

    private TextView user_message,bot_msg;
    private ListView retaurant_listView;

    ViewHolder(View itemView) {
        super(itemView);
        bot_msg = itemView.findViewById(R.id.bot_message);
        user_message = itemView.findViewById(R.id.message);
        retaurant_listView = itemView.findViewById(R.id.restaurant_items_list_ibm);

    }
}
}

请帮助我解决此问题。 在gif中,您可以看到下面的列表与上面的列表交换了,然后返回

enter image description here

0 个答案:

没有答案