doutuo3899 2017-12-24 16:58
浏览 195

MySQL RecyclerView中未显示MySQL数据(Logcat错误:无法加载memtrack模块)

I have just started developing Android application. I have used XAMPP to generate the database(MYSQL) and php to convert the extracted data into JSON. However, I could not display the following JSON output in Android Recyclerview and there is no error being generated while building this application. I have also referred to some other examples/solutions from this website but I still could not solve this issue. The code I have used is below. May I know which part can be corrected or missing?

herblist.php (to convert MYSQL data to JSON)

<?php
include 'dbConnect.php';

// Create connection
$conn = new mysqli($HostName, $HostUser, $HostPass, $DatabaseName);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

mysqli_set_charset($conn, 'utf8');
$sql = "SELECT * FROM herb";

$result = $conn->query($sql);

if ($result->num_rows >0) {
    while($row[] = $result->fetch_assoc()) {
        $tem = $row;
        $json = json_encode($tem);  
    }

} else {
    echo "No Results Found.";
}

echo $json;
$conn->close();
?>

JSON generated by herblist.php

[{"h_name":"Basil","h_image":"http:\/\/localhost\/Herb\/Herb_image\/basil.jpg"},{"h_name":"Cilantro","h_image":"http:\/\/localhost\/Herb\/Herb_image\/cilantro.jpg"},{"h_name":"Kaffir lime leaf","h_image":"http:\/\/localhost\/Herb\/Herb_image\/kaffir_lime.jpg"},{"h_name":"Lemongrass","h_image":"http:\/\/localhost\/Herb\/Herb_image\/lemongrass.jpg"},{"h_name":"Mint","h_image":"http:\/\/localhost\/Herb\/Herb_image\/mint.jpg"},{"h_name":"Oregano","h_image":"http:\/\/localhost\/Herb\/Herb_image\/oregano.jpg"},{"h_name":"Pandan leaf","h_image":"http:\/\/localhost\/Herb\/Herb_image\/pandan.jpg"},{"h_name":"Parsley","h_image":"http:\/\/localhost\/Herb\/Herb_image\/parsley.jpg"},{"h_name":"Rosemary","h_image":"http:\/\/localhost\/Herb\/Herb_image\/rosemary.jpg"},{"h_name":"Thyme","h_image":"http:\/\/localhost\/Herb\/Herb_image\/thyme.jpg"}]

searchActivity.java (the main activity)

public class searchActivity extends AppCompatActivity {

List<DataAdapter> ListDataAdapter;
RecyclerView recyclerView;
String HTTP_JSON_URL = "http://localhost/Herb/herblist.php";
String Image_Name_JSON = "h_name";
String Image_URL_JSON = "h_image";
JsonArrayRequest RequestOfJSonArray ;
RequestQueue requestQueue ;
View view ;
int RecyclerViewItemPosition ;
RecyclerView.LayoutManager RecyclerViewLayoutManager;
RecyclerView.Adapter recyclerViewadapter;
ArrayList<String> ImageTitleNameArrayListForClick;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);
    ImageTitleNameArrayListForClick = new ArrayList<>();
    ListDataAdapter = new ArrayList<>();
    recyclerView = (RecyclerView) findViewById(R.id.recyclerview1);
    recyclerView.setHasFixedSize(true);
    RecyclerViewLayoutManager = new LinearLayoutManager(this);
    recyclerView.setAdapter(recyclerViewadapter);
    recyclerView.setLayoutManager(RecyclerViewLayoutManager);
    JSON_HTTP_CALL();

    // Implementing Click Listener on RecyclerView.
    recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
        GestureDetector gestureDetector = new GestureDetector(searchActivity.this, new GestureDetector.SimpleOnGestureListener() {
            @Override public boolean onSingleTapUp(MotionEvent motionEvent) {
                return true;
            }

        });
        @Override
        public boolean onInterceptTouchEvent(RecyclerView Recyclerview, MotionEvent motionEvent) {
            view = Recyclerview.findChildViewUnder(motionEvent.getX(), motionEvent.getY());
            if(view != null && gestureDetector.onTouchEvent(motionEvent)) {

                //Getting RecyclerView Clicked Item value.
                RecyclerViewItemPosition = Recyclerview.getChildAdapterPosition(view);

                // Showing RecyclerView Clicked Item value using Toast.
                Toast.makeText(searchActivity.this, ImageTitleNameArrayListForClick.get(RecyclerViewItemPosition), Toast.LENGTH_LONG).show();
            }

            return false;
        }

        @Override
        public void onTouchEvent(RecyclerView Recyclerview, MotionEvent motionEvent) {

        }
        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

        }
    });
}

public void JSON_HTTP_CALL(){

    RequestOfJSonArray = new JsonArrayRequest(HTTP_JSON_URL,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    ParseJSonResponse(response);
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {

                }
            });

    requestQueue = Volley.newRequestQueue(searchActivity.this);
    requestQueue.add(RequestOfJSonArray);
}

public void ParseJSonResponse(JSONArray array){
    for(int i = 0; i<array.length(); i++) {
        DataAdapter GetDataAdapter2 = new DataAdapter();
        JSONObject json = null;
        try {
            json = array.getJSONObject(i);
            GetDataAdapter2.setImageTitle(json.getString(Image_Name_JSON));

            // Adding image title name in array to display on RecyclerView click event.
       ImageTitleNameArrayListForClick.add(json.getString(Image_Name_JSON));

            GetDataAdapter2.setImageUrl(json.getString(Image_URL_JSON));

        } catch (JSONException e) {
            e.printStackTrace();
        }
        ListDataAdapter.add(GetDataAdapter2);
    }

    recyclerViewadapter = new RecyclerViewAdapter(ListDataAdapter, this);
    recyclerView.setAdapter(recyclerViewadapter);
  }
  }

DataAdapter.java (The adapter part of the text in cardview)

public class DataAdapter{
  public String ImageURL;
  public String ImageTitle;

  public String getImageUrl() {return ImageURL;}

  public void setImageUrl(String ImageServerUrl) {this.ImageURL = ImageServerUrl;}

  public String getImageTitle() {return ImageTitle;}

  public void setImageTitle(String ImageTitleName) {this.ImageTitle = ImageTitleName;}
}

ImageAdapter.java (The adapter part of the image in cardview)

public class ImageAdapter {

public static ImageAdapter imageAdapter;
public Network networkOBJ ;
public RequestQueue requestQueue1;
public ImageLoader Imageloader1;
public Cache cache1 ;
public static Context context1;

LruCache<String, Bitmap> LRUCACHE = new LruCache<String, Bitmap>(30);

private ImageAdapter(Context context) {
    this.context1 = context;
    this.requestQueue1 = RequestQueueFunction();
    Imageloader1 = new ImageLoader(requestQueue1, new ImageLoader.ImageCache() {

@Override
public Bitmap getBitmap(String URL) {
    return LRUCACHE.get(URL);
}

@Override
public void putBitmap(String url, Bitmap bitmap) {
    LRUCACHE.put(url, bitmap);
}
});
    }

public ImageLoader getImageLoader() {
    return Imageloader1;
    }

public static ImageAdapter getInstance(Context SynchronizedContext) {

    if (imageAdapter == null) {
    imageAdapter = new ImageAdapter(SynchronizedContext);
    }
    return imageAdapter;
    }

public RequestQueue RequestQueueFunction() {

    if (requestQueue1 == null) {
    cache1 = new DiskBasedCache(context1.getCacheDir());
    networkOBJ = new BasicNetwork(new HurlStack());
    requestQueue1 = new RequestQueue(cache1, networkOBJ);
    requestQueue1.start();
    }
    return requestQueue1;
}
}

RecyclerViewAdapter.java

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

Context context;
List<DataAdapter> dataAdapters;
ImageLoader imageLoader;

public RecyclerViewAdapter(List<DataAdapter> getDataAdapter, Context context){
    super();
    this.dataAdapters = getDataAdapter;
    this.context = context;
}

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

@Override
public void onBindViewHolder(ViewHolder Viewholder, int position) {
    DataAdapter dataAdapterOBJ =  dataAdapters.get(position);
    imageLoader = ImageAdapter.getInstance(context).getImageLoader();
    imageLoader.get(dataAdapterOBJ.getImageUrl(),
            ImageLoader.getImageListener(
                    Viewholder.VollyImageView,//Server Image
                    R.mipmap.ic_launcher,//Before loading server image the default showing image.
                    android.R.drawable.ic_dialog_alert //Error image if requested image dose not found on server.
            )
    );

    Viewholder.VollyImageView.setImageUrl(dataAdapterOBJ.getImageUrl(), imageLoader);
    Viewholder.ImageTitleTextView.setText(dataAdapterOBJ.getImageTitle());

}

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

class ViewHolder extends RecyclerView.ViewHolder{

    public TextView ImageTitleTextView;
    public NetworkImageView VollyImageView ;

    public ViewHolder(View itemView) {
        super(itemView);
        ImageTitleTextView = (TextView) itemView.findViewById(R.id.ImageNameTextView) ;
        VollyImageView = (NetworkImageView) itemView.findViewById(R.id.VolleyImageView) ;
    }
}
}

activity_search.xml (xml file of the main activity)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
</RelativeLayout>

cardview.xml

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/cardview1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardElevation="5dp"
    card_view:contentPadding="5dp"
    card_view:cardCornerRadius="5dp"
    card_view:cardMaxElevation="5dp"
    >

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#ECEFF1">

        <com.android.volley.toolbox.NetworkImageView
            android:id="@+id/VolleyImageView"
            android:layout_width="150dp"
            android:layout_height="100dp"
            android:src="@mipmap/ic_launcher"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="10dp"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toEndOf="@+id/VolleyImageView"
            android:textSize="20sp"
            android:textColor="#000"
            android:text="JSon Image Name"
            android:id="@+id/ImageNameTextView"
            android:layout_centerVertical="true"/>
    </RelativeLayout>
</android.support.v7.widget.CardView>
  • 写回答

1条回答 默认 最新

  • douju8113 2017-12-24 17:12
    关注

    First change this

    recyclerView.setHasFixedSize(true);
    RecyclerViewLayoutManager = new LinearLayoutManager(this);
    recyclerView.setAdapter(recyclerViewadapter);
    recyclerView.setLayoutManager(RecyclerViewLayoutManager);
    

    To

    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerViewadapter = new RecyclerViewAdapter(ListDataAdapter, this);
    recyclerView.setAdapter(recyclerViewadapter);
    

    Second remove this two line from JSON_HTTP_CALL() method

    recyclerViewadapter = new RecyclerViewAdapter(ListDataAdapter, this);
    recyclerView.setAdapter(recyclerViewadapter);
    

    and put this line

    recyclerViewadapter.notifyDataSetChanged();
    
    评论

报告相同问题?

悬赏问题

  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测