我打算让一个带有Image的应用程序,然后是Text,就像这样:
在这种状态下,我应该提到我是Java和Android的新手。
所有细节,包括图像的URL都存储在mysql中,php检索mysql记录并在Android中显示它们完成(JSON数组)
这是我的问题。 Android工作室强迫我进行异步操作以从mysql(网络)获取详细信息,因此我必须在一个后台函数中获取所有细节,包括转换存储为Bitmap的图像路径。我看到的唯一选择是将一个列表对象从backgroundjob返回到主视图。我需要一些帮助列表和自定义适配器有一个ImageView和10个其他字符串。到目前为止我做了什么:
Php代码:
<?php
$con=mysqli_connect("localhost","user","","mydb");
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$result=array();
$sql = "SELECT * FROM temp limit 1";
$query_exec = mysqli_query($con,$sql) or die(mysql_error());
while($row=mysqli_fetch_assoc($query_exec)) {
$row['Image']='/Images/Myimage/2/BourneIdentity.jpg';
$result[] = $row;
}
$json_result = json_encode($result);
echo $json_result;
mysqli_close($con);
?>
请注意:我已对图像位置进行了硬编码以进行测试,我将获取文件夹中的所有图像,如下所示:
if ($result = mysqli_query($con, $sql))
{
while($row = $result->fetch_object())
{
echo '<br>';
$tempArray = $row;
$dh = opendir('c:/wamp/www/'.$row->pic_dir);
while (false !== ($filename = readdir($dh))) {
if ($filename !="." and $filename != "..") {
echo '<img src="' .$row->pic_dir.$filename.'" width="40" height="40"/>' ;
}
}
echo '<a href="'.'test.php'.'">' . $row->description .'</a>';
}
}
Android - MainActivity.java(它不是接近完整,只是不知道如何从列表/数组必须包含不同的对象)
package com.example.rgopalkr.readdb;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.Image;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
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.lang.String;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
class TestAsync extends AsyncTask<Void, Integer, Bitmap>
{
protected void onPreExecute (){
TextView tv = (TextView) findViewById(R.id.textv);
tv.setText("Get Discription from database");
}
protected Bitmap doInBackground(Void...arg0) {
StringBuilder str= new StringBuilder();
Bitmap bmp = null;
try {
URL url = new URL("http://10.0.2.2/shareit/php/test_json.php");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStream in = conn.getInputStream();
InputStreamReader isw = new InputStreamReader(in);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = "";
while ((line = br.readLine()) != null) {
str.append(line);
}
str.append(conn.getResponseCode());
conn.disconnect();
} catch (IOException M) {M.printStackTrace();}
try {
JSONArray jArray = new JSONArray(str.toString());
StringBuilder sb = new StringBuilder();
String imagePath="http://10.0.2.2/shareit/";
for (int i=0; i < jArray.length(); i++)
{
try {
JSONObject oneObject = jArray.getJSONObject(i);
imagePath += oneObject.getString("Image");
URL bmpurl = new URL(imagePath);
bmp = BitmapFactory.decodeStream(bmpurl.openConnection().getInputStream());
// iv.setImageBitmap(bmp);
sb.append(imagePath + ',');
} catch (JSONException | IOException e ) {e.printStackTrace();}
}
// tv.setText(sb.toString());
} catch (JSONException JE) {JE.printStackTrace();}
return bmp;
}
protected void onProgressUpdate(Integer...a){
}
protected void onPostExecute(Bitmap result) {
TextView tv = (TextView) findViewById(R.id.textv);
ImageView iv = (ImageView) findViewById(R.id.imageView);
iv.setImageBitmap(result);
}
}
public void loadItems(View v){
Button button = (Button) findViewById(R.id.tButton);
TextView tv = (TextView) findViewById(R.id.textv);
new TestAsync().execute();
}
public void Messagebox(int msg) {
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
}
活动主要的XML代码,我想我知道我在列表视图的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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<Button
android:id="@+id/tButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Press to Load"
android:onClick="loadItems"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" />
<TextView
android:id="@+id/textv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="false"
android:text="This is where the text will come"
android:layout_centerVertical="@+id/imageView"
android:layout_centerHorizontal="true" />
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/lending"
android:id="@+id/imageView" />
</RelativeLayout>
仿真器现在看起来如何(新手,抱歉不能嵌入图片,必须得到10个代表才能嵌入图片)
How my current emulator screen looks like
我在这里阅读了帖子,它给了我一些想法:http-w] w [w \ androidhive \ info / 2012/02 / android-custom-listview-with-image-and-text /,但看起来很复杂。如果有人可以帮助我使用多个对象类型列表并给出一些指示如何继续前进它将会很棒!
此外,第一个屏幕只有描述的缩略图,当按下它时,应该显示为该记录存储的所有图像。
答案 0 :(得分:0)
首先,不要创建所有位图作为json解析的一部分。列表视图中显示的图像应该是延迟加载的。
这意味着您需要做的就是将图像的URL解析回UI线程。
当用户滚动时,此时将加载图像。
看看一个名为Picasso的图书馆,它将为你加载。
在依赖项下的gradle文件中添加
compile 'com.squareup.picasso:picasso:2.5.2'
然后在listview适配器的getView中添加
Picasso.with(context).load([imageUri]).into(imageView);
如果您愿意,还可以添加占位符
Picasso.with(context).load([imageUri]).placeholder([placeholder res]).into(imageView);
基本适配器的完整代码