Shikhar Singh
Shikhar Singh

Reputation: 112

RecyclerView Issue

MainActivity.java

its my main java class

package com.example.shikhu.newpractice;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

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

    button = (Button) findViewById(R.id.button);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(MainActivity.this,DisplayList.class));
        }
    });
 }
}

DisplayList.java

package com.example.shikhu.newpractice;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class DisplayList extends AppCompatActivity {

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

    BackgroundTask backgroundTask = new BackgroundTask(DisplayList.this);
    backgroundTask.execute();
}
}

BackgroundTask.java

package com.example.shikhu.newpractice;

import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
 import java.util.ArrayList;


public class BackgroundTask extends AsyncTask<Void,Fruit,Void> {

String json_string = "http://192.168.1.18:8081/fruitinfo/get_fruit_details.php";

Context ctx;
Activity activity;
RecyclerView recyclerView;
RecyclerView.Adapter adapter;
RecyclerView.LayoutManager layoutManager;

ArrayList<Fruit> arrayList = new ArrayList<>();
public  BackgroundTask(Context ctx)
{
    this.ctx=ctx;
    activity = (Activity)ctx;
}



@Override
protected void onPreExecute() {

    recyclerView = (RecyclerView)activity.findViewById(R.id.recyclerview);
    layoutManager = new LinearLayoutManager(ctx);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setHasFixedSize(true);
    adapter = new RecyclerAdapter(arrayList);
    recyclerView.setAdapter(adapter);
}

@Override
protected Void doInBackground(Void... params) {


    try{
        URL url = new URL(json_string);
        HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
        InputStream inputStream = httpURLConnection.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        StringBuilder stringBuilder = new StringBuilder();
        String line;

        while((line=bufferedReader.readLine())!=null)
        {
            stringBuilder.append(line + "\n");
        }

        httpURLConnection.disconnect();
        String json_string = stringBuilder.toString().trim();
        JSONObject jsonObject = new JSONObject(json_string);
        JSONArray jsonArray = jsonObject.getJSONArray("server_response");

        int count = 0;

        while (count<jsonArray.length())
        {
            JSONObject JO = jsonArray.getJSONObject(count);
            count++;

            Fruit fruit = new Fruit(JO.getString("name"),JO.getInt("calories"),JO.getDouble("fat"));
            publishProgress(fruit);
        }


        Log.d("JSON STRING",json_string);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return null;
}

@Override
protected void onProgressUpdate(Fruit... values) {

    arrayList.add(values[0]);
    adapter.notifyDataSetChanged();
}

@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);
}
}

RecyclerAdapter.java

 package com.example.shikhu.newpractice;

 import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.TextView;

 import java.util.ArrayList;


 public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.RecyclerViewHolder> {

private static final int TYPE_HEAD = 0;
private  static  final int TYPE_LIST = 1;

ArrayList<Fruit> arrayList = new ArrayList<>();

public RecyclerAdapter(ArrayList<Fruit> arrayList)
{
    this.arrayList =arrayList;
}

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

    if (viewType == TYPE_HEAD)
    {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.header_layout,parent,false);
        RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(view,viewType);
        return recyclerViewHolder;
    }
    else if (viewType == TYPE_LIST)
    {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout,parent,false);
        RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(view,viewType);
        return recyclerViewHolder;
    }
    return null;
}

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

    if (holder.viewType == TYPE_LIST) {
        Fruit fruit = arrayList.get(position);
        holder.Name.setText(fruit.getName());
        holder.Calories.setText(Integer.toString(fruit.getCalories()));
        holder.Fat.setText(Double.toString(fruit.getFat()));
    }

}

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

public static class RecyclerViewHolder extends RecyclerView.ViewHolder
{
    TextView Name,Calories,Fat;
    int viewType;
    public RecyclerViewHolder(View v,int viewType)
    {
        super(v);
        if (viewType == TYPE_LIST) {
            Name = (TextView) v.findViewById(R.id.name);
            Calories = (TextView) v.findViewById(R.id.calories);
            Fat = (TextView) v.findViewById(R.id.fat);
            this.viewType = TYPE_LIST;
        }else if (viewType == TYPE_HEAD)
        {
            this.viewType = TYPE_HEAD;
        }

    }

    public int getItemViewType(int position)
    {
        if (position==0)

            return TYPE_HEAD;
            return TYPE_LIST;

    }
}
}

Fruit.java

package com.example.shikhu.newpractice;

public class Fruit {
private String name;
private int calories;
private Double fat;

public Fruit(String name,int calories,Double fat)
{
    this.setName(name);
    this.setCalories(calories);
    this.setFat(fat);
}

public String getName()
{
    return name;
}
public  void setName(String name)
{
    this.name=name;
}

public int getCalories()
{
    return calories;
}
public  void setCalories(int calories)
{
    this.calories=calories;
}

public Double getFat()
{
    return fat;
}
public  void setFat(Double fat)
{
    this.fat=fat;
}
}

Row_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="75dp"
android:layout_marginRight="15dp"
android:layout_marginLeft="15dp"
android:weightSum="1">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:gravity="center_vertical"
    android:textStyle="bold"
    android:textSize="20dp"
    android:text="Name"
    android:id="@+id/name"
    android:layout_weight="0.39" />

<TextView
    android:layout_width="79dp"
    android:layout_height="match_parent"
    android:text="Calorie"
    android:gravity="center_vertical"
    android:textSize="20dp"
    android:textStyle="bold"
    android:id="@+id/calories"
    android:layout_marginLeft="40dp" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:text="Fat"
    android:gravity="center_vertical"
    android:textSize="20dp"
    android:textStyle="bold"
    android:id="@+id/fat"
    android:layout_weight="0.15"
    android:layout_marginLeft="60dp" />
    </LinearLayout>

Header_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="65dp"
android:background="?attr/colorPrimary">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:gravity="center_vertical"
    android:textStyle="bold"
    android:textSize="20dp"
    android:text="Name"
    android:id="@+id/name1"
    android:layout_weight="0.20"
    android:textColor="#ffffff"
    android:layout_marginLeft="10dp" />

<TextView
    android:layout_width="79dp"
    android:layout_height="match_parent"
    android:text="Calorie"
    android:gravity="center_vertical"
    android:textSize="20dp"
    android:textStyle="bold"
    android:id="@+id/calories1"
    android:layout_marginLeft="10dp"
    android:textColor="#ffffff"/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:text="Fat"
    android:gravity="center_vertical"
    android:textSize="20dp"
    android:textStyle="bold"
    android:id="@+id/fat1"
    android:layout_weight="0.15"
    android:layout_marginLeft="60dp"
    android:textColor="#ffffff"/>

 </LinearLayout>

activity_display_list.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".DisplayList">

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/recyclerview"></android.support.v7.widget.RecyclerView>

 </RelativeLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.shikhu.newpractice.MainActivity">

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Display List"
    android:id="@+id/button"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true" />
 </RelativeLayout>

My Output

i dont know why it is showing text of textview rather the data fetched from database enter image description here

PhpScript

  <?php
   $host = "localhost";
   $user = "root";
   $pass = "";
   $db = "fruit";

   $con = mysqli_connect($host,$user,$pass,$db);

   $query= "select * from fruit_details;";

   $result = mysqli_query($con,$query);
   $response = array();

   while($row = mysqli_fetch_array($result))
    {
array_push($response,array('name'=>$row[0],'calories'=>$row[1],'fat'=>$row[2        ]));
  }

 mysqli_close($con);

 echo json_encode(array('server_response'=>$response));
 ?>

Upvotes: 1

Views: 179

Answers (4)

Gil Moshayof
Gil Moshayof

Reputation: 16761

I found your problem.

Your method getItemViewType is inside your ViewHolder class. It needs to be moved to be inside your adapter class. Right now, since your adapter has no getItemViewType method, it assumes all view types are 0 (HEADER), and so nothing is being bound.

Move this method to your adapter class and all will work :)

Edit

Another option which should work for you is to stop using viewTypes all together. Since you're using the same viewHolder anyway, when you bind the view, instead of checking the viewType, check the position:

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

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout,parent,false);
    RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(view, TYPE_LIST);
    return recyclerViewHolder;
}

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

    if (position > 0) {
        Fruit fruit = arrayList.get(position-1);
        holder.Name.setText(fruit.getName());
        holder.Calories.setText(Integer.toString(fruit.getCalories()));
        holder.Fat.setText(Double.toString(fruit.getFat()));
    } else {
       holder.Name.setText("Name");
       holder.Calories.setText("Calories");
       holder.Fat.setText("Fat");
    }

}

So now, all your view types will be of type list. This is fine, because the layout is basically identical, only the values of the TextViews changes. Instead of using viewType, simply use the position. If the position is 0, set the header fields, otherwise, use the Fruit data.

I know this is not the solution you wanted - I can't seem to find why the viewType implementation doesn't work, however, this solution should give you the result you wanted.

Hope this helps!

Upvotes: 0

Rahul
Rahul

Reputation: 31

I think you are not managing views for header in your view holder and from bind view holder it is everytime getting only header view in return; SO just debug your code and let me know that are you getting TYPE_LIST data view or not. Also make references for header view in View holder and set text to it also.

Upvotes: 0

Shikhar Singh
Shikhar Singh

Reputation: 112

BackgroundTask.Java

 package com.example.shikhu.newpractice;

import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;


public class BackgroundTask extends AsyncTask<Void,Fruit,Void> {

String json_string = "http://127.0.0.1:8081/fruitinfo/get_fruit_details.php";

Context ctx;
Activity activity;
RecyclerView recyclerView;
RecyclerView.Adapter adapter;
RecyclerView.LayoutManager layoutManager;

ArrayList<Fruit> arrayList = new ArrayList<>();
public  BackgroundTask(Context ctx)
{
    this.ctx=ctx;
    activity = (Activity)ctx;
}



@Override
protected void onPreExecute() {

    recyclerView = (RecyclerView)activity.findViewById(R.id.recyclerview);
    layoutManager = new LinearLayoutManager(ctx);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setHasFixedSize(true);
    adapter = new RecyclerAdapter(arrayList);
    recyclerView.setAdapter(adapter);
}

@Override
protected Void doInBackground(Void... params) {


    try{
        URL url = new URL(json_string);
        HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
        InputStream inputStream = httpURLConnection.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        StringBuilder stringBuilder = new StringBuilder();
        String line;

        while((line=bufferedReader.readLine())!=null)
        {
            stringBuilder.append(line + "\n");
        }

        httpURLConnection.disconnect();
        String json_string = stringBuilder.toString().trim();
        JSONObject jsonObject = new JSONObject(json_string);
        JSONArray jsonArray = jsonObject.getJSONArray("server_response");

        int count = 0;

        while (count<jsonArray.length())
        {
            JSONObject JO = jsonArray.getJSONObject(count);
            count++;

            Fruit fruit = new Fruit(JO.getString("name"),JO.getInt("calorie"),JO.getDouble("fat"));
            publishProgress(fruit);
        }


        Log.d("JSON STRING",json_string);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return null;
}

@Override
protected void onProgressUpdate(Fruit... values) {

    arrayList.add(values[0]);
    adapter.notifyDataSetChanged();
}

@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);
}
 }

RecyclerAdapter.java

  package com.example.shikhu.newpractice;

  import android.support.annotation.IdRes;
 import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
  import android.view.View;
 import android.view.ViewGroup;
 import android.widget.TextView;

 import java.util.ArrayList;


 public class RecyclerAdapter extends    RecyclerView.Adapter<RecyclerAdapter.RecyclerViewHolder> {

private static final int TYPE_HEAD = 0;
private  static  final int TYPE_LIST = 1;

ArrayList<Fruit> arrayList = new ArrayList<>();

public RecyclerAdapter(ArrayList<Fruit> arrayList)
{
    this.arrayList =arrayList;
}

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

    if (viewType == TYPE_HEAD)
    {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.header_layout,parent,false);
        RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(view,viewType);
        return recyclerViewHolder;
    }
    else if (viewType == TYPE_LIST)
    {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout,parent,false);
        RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(view,viewType);
        return recyclerViewHolder;
    }
    return null;
}

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

    if (holder.viewType == TYPE_LIST) {
        Fruit fruit = arrayList.get(position-1);
        holder.Name.setText(fruit.getName());
        holder.Calories.setText(Integer.toString(fruit.getCalories()));
        holder.Fat.setText(Double.toString(fruit.getFat()));
    }

}



@Override
public int getItemCount() {
    return arrayList.size()+1;
}

public static class RecyclerViewHolder extends RecyclerView.ViewHolder
{
    TextView Name,Calories,Fat;
    int viewType;
    public RecyclerViewHolder(View v,int viewType)
    {
        super(v);
        if (viewType == TYPE_LIST) {
            Name = (TextView) v.findViewById(R.id.name);
            Calories = (TextView) v.findViewById(R.id.calories);
            Fat = (TextView) v.findViewById(R.id.fat);
            this.viewType = TYPE_LIST;
        }else if (viewType == TYPE_HEAD)
        {
            this.viewType = TYPE_HEAD;
        }

    }

}
@Override
public int getItemViewType(int position) {
    if (position==0)
        return TYPE_HEAD;
    else
        return TYPE_LIST;
}

}

Upvotes: 0

Abhishek Patel
Abhishek Patel

Reputation: 4328

Your Adapter always return TYPE_HEAD i think this is wrong.

 @Override
public int getItemViewType(int position) {
    if (position == 0) {
        return TYPE_HEAD;
    } else {
        return TYPE_LIST;
    }

}

Upvotes: 1

Related Questions