【问题标题】:Fetching Data from mysql JSON to Listview getting ID from model从 mysql JSON 获取数据到 Listview 从模型中获取 ID
【发布时间】:2015-03-30 15:11:20
【问题描述】:

我的问题如下:

我有一个在线 mysql 数据库,我通过 JSON 将一些数据绑定到片段内的列表视图。我以前使用本地 sqlite 数据库中的游标适配器做过很多次,但我现在遇到了一些问题,因为它的 JSON。

数据可以很好地显示在自定义列表视图中,但是当我单击一个项目时,我想从在线数据库中获取 ID(以及其他行)并通过 intent.putExtra() 将其传递给下一个活动.

数据存储在模型中,但目前我将 ID TextView 的可见性设置为“已消失”,并简单地存储编辑文本的值,但这不是很有效,因为我在应用程序中有许多列表视图。我不确定我是否正确启动了模型,因为它给了我错误,因此我恢复到 get.Text.toString 方法来存储 ID。

如何从数组适配器获取模型中存储的 ID?

干杯 :) 我只是没有得到一些东西......

更新#

添加行后

DietNameModel dm = data.get(position);
        int id2 = dm.getDietID();

        String  weight_id = String.valueOf(id2);

        Toast.makeText(getActivity(), weight_id, Toast.LENGTH_LONG).show(); 

我在 logcat 中收到以下错误。

01-31 04:11:24.895: W/dalvikvm(1260): threadid=1: thread exiting with uncaught exception (group=0xa621c908)
01-31 04:11:24.899: E/AndroidRuntime(1260): FATAL EXCEPTION: main
01-31 04:11:24.899: E/AndroidRuntime(1260): java.lang.NullPointerException
01-31 04:11:24.899: E/AndroidRuntime(1260):     at com.dietmanager.main.DietsFragmentJSON$1.onItemClick(DietsFragmentJSON.java:100)
01-31 04:11:24.899: E/AndroidRuntime(1260):     at android.widget.AdapterView.performItemClick(AdapterView.java:298)
01-31 04:11:24.899: E/AndroidRuntime(1260):     at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
01-31 04:11:24.899: E/AndroidRuntime(1260):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749)
01-31 04:11:24.899: E/AndroidRuntime(1260):     at android.widget.AbsListView$1.run(AbsListView.java:3423)
01-31 04:11:24.899: E/AndroidRuntime(1260):     at android.os.Handler.handleCallback(Handler.java:725)
01-31 04:11:24.899: E/AndroidRuntime(1260):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-31 04:11:24.899: E/AndroidRuntime(1260):     at android.os.Looper.loop(Looper.java:137)
01-31 04:11:24.899: E/AndroidRuntime(1260):     at android.app.ActivityThread.main(ActivityThread.java:5041)
01-31 04:11:24.899: E/AndroidRuntime(1260):     at java.lang.reflect.Method.invokeNative(Native Method)
01-31 04:11:24.899: E/AndroidRuntime(1260):     at java.lang.reflect.Method.invoke(Method.java:511)
01-31 04:11:24.899: E/AndroidRuntime(1260):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-31 04:11:24.899: E/AndroidRuntime(1260):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-31 04:11:24.899: E/AndroidRuntime(1260):     at dalvik.system.NativeStart.main(Native Method)

DietJSONFragment

public class DietsFragmentJSON extends Fragment implements FetchDietNameListener  {

 private List<DietNameModel> data;
Activity mActivity;
View rootView;
private int dietID;
private ListView listview;
private String diet_ID, diet_name, diet_category, diet_desc ;
private ProgressDialog dialog;
private EditText et;
private ListView lv;
private TextView idTxt, weight_loss, diet_desc_text, diet_rating, diet_followers_txt, diet_duration;

private static List<DietNameModel> dietnamemodel;



public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {



    rootView = inflater.inflate(R.layout.diet_name_fragment, container, false);

    listview = (ListView) rootView.findViewById(R.id.listview);

    mActivity = getActivity();

    initView();

    return rootView;


}


private void initView() {
    // show progress dialog
    dialog = ProgressDialog.show(mActivity, "", "Loading...");

    String url = "http:xxxxxxxxxxxxxxx.diet_name.php";
    FetchDietDataTask task = new FetchDietDataTask(this);
    task.execute(url);
}


public void onFetchComplete(List<DietNameModel> data) {
    // dismiss the progress dialog
    if(dialog != null)  dialog.dismiss();

    // create new adapter
    DietNameAdapter adapter = new DietNameAdapter(getActivity(), data);
    // set the adapter to list
    listview.setAdapter(adapter);      

    listview.setOnItemClickListener(myOnItemClickListener);
}

OnItemClickListener myOnItemClickListener
= new OnItemClickListener(){

    @SuppressLint("NewApi") @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {

        //DietNameModel dm = data.get(position);
        //String dietname = dm.getDietName();

        //HERE NEED TO GET ID FROM THE MODEL 


idTxt = (TextView)view.findViewById(R.id.diet_iD);
dietID = Integer.valueOf(idTxt.getText().toString());


diet_name = ((TextView) view.findViewById(R.id.titleTxt)).getText().toString();


Intent intent = new Intent(getActivity(), DietActivity.class);

    Bundle bundle = ActivityOptions.makeCustomAnimation(getActivity(), R.anim.left_slide_in, R.anim.left_slide_out).toBundle();
    intent.putExtra("id", dietID);
intent.putExtra("dietname", diet_name);
    //intent.putExtra("diet_duration_string", diet_duration_String);
    getActivity().startActivity(intent, bundle);
  }
};

@Override
public void onFetchFailure(String msg) {
    // dismiss the progress dialog
    if(dialog != null)  dialog.dismiss();

    Toast.makeText(getActivity(), msg, Toast.LENGTH_LONG).show();
}
}

饮食名称模型

public class DietNameModel {

private String diet_name;
private String diet_desc;
private long followers;
private int rating;
private int _id;
private int diet_duration;
private int weight_loss_total_kg;

private String diet_category;

public DietNameModel(){

}

public DietNameModel(int id, int diet_duration, int rating, long followers, String diet_name, String diet_desc, String diet_cat){

    this._id = id;
    this.rating = rating;
    this.followers = followers;
    this.diet_duration = diet_duration;
    this.diet_name = diet_name;
    this.diet_desc = diet_desc;
    this.diet_category = diet_cat;

}

public DietNameModel(String diet_name, String diet_desc, String diet_cat){

    this.diet_name = diet_name;
    this.diet_desc = diet_desc;
    this.diet_category = diet_cat;
}


public String getDietCategory() {
    return diet_category;
}
public void setDietCategory(String diet_category) {
    this.diet_category = diet_category;
}

public String getDietName() {
    return diet_name;
}
public void setDietName(String diet_name) {
    this.diet_name = diet_name;
}
public String getDietDesc() {
    return diet_desc;
}
public void setDietDesc(String diet_desc) {
    this.diet_desc = diet_desc;
}
public long getFollowers() {
    return followers;
}
public void setFollowers(long followers) {
    this.followers = followers;
}
public int getRating() {
    return rating;
}
public void setRating(int rating) {
    this.rating = rating;
}

public int getDietID() {
    return _id;
}
public void setDietID(int _id) {
    this._id = _id;
}

public int getTotalWeightLoss() {
    return weight_loss_total_kg;
}
public void setTotalWeightLoss(int weight_loss_total_kg) {
    this.weight_loss_total_kg = weight_loss_total_kg;
}
public int getDietDuration() {
    return diet_duration;
}
public void setDietDuration(int diet_duration) {
    this.diet_duration = diet_duration;
}
}

FetchDietDataTask

public class FetchDietDataTask extends AsyncTask<String, Void, String>{

private final FetchDietNameListener listener;
private String msg;

public FetchDietDataTask(FetchDietNameListener listener) {
    this.listener = listener;
}

@Override
protected String doInBackground(String... params) {
    if(params == null) return null;

    // get url from params
    String url = params[0];

    try {
        // create http connection
        HttpClient client = new DefaultHttpClient();
        HttpGet httpget = new HttpGet(url);

        // connect
        HttpResponse response = client.execute(httpget);

        // get response
        HttpEntity entity = response.getEntity();

        if(entity == null) {
            msg = "No response from server";
            return null;        
        }

        // get response content and convert it to json string
        InputStream is = entity.getContent();
        return streamToString(is);
    }
    catch(IOException e){
        msg = "No Network Connection";
    }

    return null;
}

@Override
protected void onPostExecute(String sJson) {
    if(sJson == null) {
        if(listener != null) listener.onFetchFailure(msg);
        return;
    }        

    try {
        // convert json string to json array
        JSONArray aJson = new JSONArray(sJson);
        // create list list
        List<DietNameModel> dietnamemodellist = new ArrayList<DietNameModel>();

        for(int i=0; i<aJson.length(); i++) {
            JSONObject json = aJson.getJSONObject(i);
            DietNameModel dietnamemodel = new DietNameModel();

            dietnamemodel.setDietID(Integer.parseInt(json.getString("_id")));  
            dietnamemodel.setDietName(json.getString("diet_name"));
            dietnamemodel.setDietCategory(json.getString("diet_category"));
            dietnamemodel.setDietDuration(Integer.parseInt(json.getString("diet_duration")));  
            dietnamemodel.setTotalWeightLoss(Integer.parseInt(json.getString("total_weight_loss")));  
            dietnamemodel.setFollowers(Long.parseLong(json.getString("followers")));
            dietnamemodel.setRating(Integer.parseInt(json.getString("rating")));  
          // dietnamemodel.setIcon(json.getString("icon"));

            // add the name to list
            dietnamemodellist.add(dietnamemodel);
        }
        //notify the activity that fetch data has been complete
        if(listener != null) listener.onFetchComplete(dietnamemodellist);
    } catch (JSONException e) {
        msg = "Invalid response";
        if(listener != null) listener.onFetchFailure(msg);
        return;
    }        
}

/**
 * This function will convert response stream into json string
 * @param is respons string
 * @return json string
 * @throws IOException
 */
public String streamToString(final InputStream is) throws IOException{
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder(); 
    String line = null;

    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
    } 
    catch (IOException e) {
        throw e;
    } 
    finally {           
        try {
            is.close();
        } 
        catch (IOException e) {
            throw e;
        }
    }

    return sb.toString();
}
}

饮食名称适配器

public class DietNameAdapter extends ArrayAdapter<DietNameModel>{

private List<DietNameModel> items;
private TextView diet_name, diet_cat, diet_duration, diet_weight_loss, diet_ID ;


private LinearLayout ratingCntr;
private TextView followersText;



public DietNameAdapter(Context context, List<DietNameModel> items) {
    super(context, R.layout.row_diet_name_dev);


    this.items = items;
}


public int getCount() {
    return items.size();
}


public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;

    if(v == null) {
        LayoutInflater li = LayoutInflater.from(getContext());
        v = li.inflate(R.layout.row_diet_name_dev, null);            
    }

    DietNameModel infomodel = items.get(position);


    if(infomodel != null) {

        diet_ID = (TextView)v.findViewById(R.id.diet_iD);
         diet_name = (TextView)v.findViewById(R.id.titleTxt);
         ratingCntr = (LinearLayout)v.findViewById(R.id.ratingCntr);
         followersText  = (TextView)v.findViewById(R.id.followers);
         diet_cat = (TextView)v.findViewById(R.id.dietCatTxt);
         diet_duration = (TextView)v.findViewById(R.id.diet_duration_txt);
         diet_weight_loss =  (TextView)v.findViewById(R.id.diet_weight_lost);


         if( diet_ID != null) {
             NumberFormat nf2 = NumberFormat.getNumberInstance();
             diet_ID.setText(nf2.format(infomodel.getDietID()));            
         }


        if( diet_name != null)  diet_name.setText(infomodel.getDietName());

        if( diet_cat != null)  diet_cat.setText(infomodel.getDietCategory());



        if(followersText != null) {
            NumberFormat nf = NumberFormat.getNumberInstance();
            followersText.setText("Followers: " + nf.format(infomodel.getFollowers()));            
        }

        if( diet_duration != null) {
            NumberFormat nf2 = NumberFormat.getNumberInstance();
            diet_duration.setText(nf2.format(infomodel.getDietDuration()));            
        }

        if( diet_weight_loss != null) {
            NumberFormat nf2 = NumberFormat.getNumberInstance();
            diet_weight_loss.setText(nf2.format(infomodel.getTotalWeightLoss()));            
        }

        if(ratingCntr != null && ratingCntr.getChildCount() == 0) {        
            /*
             * max rating: 5
             */
            for(int i=1; i<=5; i++) {
                ImageView iv = new ImageView(getContext());

                if(i <= infomodel.getRating()) {
                    iv.setImageDrawable(getContext().getResources().getDrawable(R.drawable.start_checked));
                }


                ratingCntr.addView(iv);
            }
        }
    }

    return v;
}
}

【问题讨论】:

  • DietsFragmentJSON.java 的第 100 行是什么?
  • DietNameModel dm = data.get(position);
  • ListView 是否已填充?
  • 是的,所有数据都填充在列表视图中并且显示良好,因此我可以通过简单地使用 Diet_name = ((TextView) view.findViewById(R.id.titleTxt)) 来获取 id 或名称。 getText().toString();但是这不好...我确实有一个文本视图,其值 hidden 获取 ID,但数据库中还有其他字段未填充到列表视图中,我也想退休,首先是 ID
  • 伙计,我想我刚刚解决了它,我在 on fetchcomplete 之前添加了以下代码行。 public void onFetchComplete(List data) { // 关闭进度对话框 this。数据 = 数据;

标签: php android mysql json listview


【解决方案1】:

空指针指向的数据列表没有正确设置,问题已经解决。必须添加的行是 this.data = data;

public void onFetchComplete(List<DietNameModel> data) {
    this.data = data;

    if(dialog != null) 
        dialog.dismiss();

    // create new adapter
     adapter = new DietNameAdapter(getActivity(), data);
    // set the adapter to list
    listview.setAdapter(adapter);      

    listview.setOnItemClickListener(myOnItemClickListener);
}

【讨论】:

    【解决方案2】:

    在您的 ListView 的 OnItemClickListener 中,您是否尝试过这样获取 ID:

    OnItemClickListener myOnItemClickListener = new OnItemClickListener(){
    
        @SuppressLint("NewApi") @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
    
            DietNameModel dm = data.get(position);
            int id = dm.getDietID();
            ...
    

    【讨论】:

    • 您好,感谢您的回复,我确实尝试添加以下内容,我已经将其注释掉了,但它给了我一个错误,我添加了这个以将值输出为吐司,但什么也没有...... DietNameModel dm = data.get(position); int id2 = dm.getDietID(); String weight_id = String.valueOf(id2); Toast.makeText(getActivity(), weight_id, Toast.LENGTH_LONG).show();
    • 我认为它与数据有关?
    猜你喜欢
    • 2014-05-07
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    相关资源
    最近更新 更多