1

i am new in android i have created a simple data fetching application.I am fetching two variable from my php file but i am getting value of only one variable.And when i am testing in my browser i am getting both variable value in json.

Code:

public class MainActivity extends Activity{

ArrayList<Person> arrayofWebData = new ArrayList<Person>();

class Person {

    boolean messageReceived;
       public String message;
public String message_recd;
public String message_sent;

}

FancyAdapter aa = null;
static ArrayList<String> resultRow;

public void onCreate(Bundle savedInstanceState){
    try{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
        String result = "";

        try{
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://10.0.2.2/progress_card/messages/get_messages.php");
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            InputStream webs = entity.getContent();

            try{
                 BufferedReader reader = new BufferedReader(new InputStreamReader(webs, "UTF-8"), 8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null){
                    sb.append(line+"\n");
                }

                webs.close();
                result = sb.toString();
            }catch(Exception e){
                Log.e("log_tag", "Error Converting Result "+e.toString());

            }

        }catch(Exception e){
                Log.e("log_tag", "Error Converting Result "+e.toString());

            }

        try{

            JSONArray jArray = new JSONArray(result);
            for(int i=0;i<jArray.length();i++){
                JSONObject json_data = jArray.getJSONObject(i);

                Person resultRow = new Person();
                if (json_data.has("message_recd")){
                    resultRow.messageReceived = true;
                    resultRow.message = json_data.getString("message_recd");
                }
                if (json_data.has("message_sent")){
                    resultRow.messageReceived = false;
                    resultRow.message = json_data.getString("message_sent");
                }
                arrayofWebData.add(resultRow);  

               //...
               //aa = new FancyAdapter();


               //...
        }
        }
        catch(JSONException e){
            Log.e("log_tag", "Error Converting Result "+e.toString());
        }

        ListView myListView = (ListView)findViewById(R.id.myListView);
        aa = new FancyAdapter(this,arrayofWebData);
        myListView.setAdapter(aa);
    }
        catch(Exception e){
        Log.e("log_tag", "Error Converting Result "+e.toString());
        e.printStackTrace();
    }
}
class FancyAdapter extends ArrayAdapter<Person>{
    FancyAdapter(Activity activity, ArrayList<Person> list){ 
        super(activity,android.R.layout.simple_expandable_list_item_1,list);
    } 
    public View getView(int position,View convertView,ViewGroup parent){
        Person selectedPerson = getItem(position);
        ViewHolder holder;

        if(convertView == null){
            LayoutInflater inflater = getLayoutInflater();
            convertView = inflater.inflate(R.layout.row, null);
            holder = new ViewHolder(convertView,selectedPerson.messageReceived);
            convertView.setTag(holder);
        } 
        else{ 
            holder = (ViewHolder)convertView.getTag();
        } 
        holder.populateFrom(selectedPerson);
        return(convertView);
    } 
} 



class ViewHolder{ 
    public TextView message = null;

    ViewHolder(View row,boolean messageReceived){
        if(messageReceived)
             message = (TextView)row.findViewById(R.id.name);
        else
             message = (TextView)row.findViewById(R.id.colors);
    } 
    void populateFrom(Person p){
        message.setText(p.message);
    } 
} 
}

Logcat:

    10-02 08:27:05.611: E/AndroidRuntime(2045): FATAL EXCEPTION: main
10-02 08:27:05.611: E/AndroidRuntime(2045): Process: com.shirish.hello, PID: 2045
10-02 08:27:05.611: E/AndroidRuntime(2045): java.lang.NullPointerException
10-02 08:27:05.611: E/AndroidRuntime(2045):     at com.shirish.hello.MainActivity$ViewHolder.populateFrom(MainActivity.java:153)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at com.shirish.hello.MainActivity$FancyAdapter.getView(MainActivity.java:136)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.widget.AbsListView.obtainView(AbsListView.java:2255)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.widget.ListView.makeAndAddView(ListView.java:1790)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.widget.ListView.fillDown(ListView.java:691)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.widget.ListView.fillFromTop(ListView.java:752)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.widget.ListView.layoutChildren(ListView.java:1630)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.widget.AbsListView.onLayout(AbsListView.java:2087)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.view.View.layout(View.java:14817)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.view.ViewGroup.layout(ViewGroup.java:4631)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.view.View.layout(View.java:14817)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.view.ViewGroup.layout(ViewGroup.java:4631)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.view.View.layout(View.java:14817)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.view.ViewGroup.layout(ViewGroup.java:4631)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.view.View.layout(View.java:14817)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.view.ViewGroup.layout(ViewGroup.java:4631)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.view.View.layout(View.java:14817)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.view.ViewGroup.layout(ViewGroup.java:4631)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1983)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1740)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.view.Choreographer.doCallbacks(Choreographer.java:574)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.view.Choreographer.doFrame(Choreographer.java:544)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.os.Handler.handleCallback(Handler.java:733)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.os.Handler.dispatchMessage(Handler.java:95)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.os.Looper.loop(Looper.java:136)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at android.app.ActivityThread.main(ActivityThread.java:5001)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at java.lang.reflect.Method.invokeNative(Native Method)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at java.lang.reflect.Method.invoke(Method.java:515)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
10-02 08:27:05.611: E/AndroidRuntime(2045):     at dalvik.system.NativeStart.main(Native Method)

Json Response in browser:

[{"message_recd":"checking"},{"message_recd":"qwerty"},{"message_recd":"checking"},{"message_recd":"qw,nsbdf"},{"message_recd":"rtr"},{"message_recd":"QSDWFDWDF"},{"message_recd":"as"},{"message_recd":"sdad"},{"message_recd":"checking12345"},{"message_sent":"hey whtas up"},{"message_sent":"hey whtas up hey whtas "},{"message_sent":"hey whtas up test"},{"message_sent":"hey whtas up11"}]

My php code:

    <?php

  error_reporting(0);
  define('HOST','localhost');
  define('USER','root');
  define('PASS','');
  define('DB','progress_card');
  $con = mysqli_connect(HOST,USER,PASS,DB);


  $req_dump = print_r($_POST, TRUE);    
    $fp = fopen('request.txt', 'a');
    fwrite($fp, $req_dump);
    fclose($fp);

  //$username = $_POST['username'];
  $sql1 = "select * from student_detail where parentusername='suyash1'";//username = suyash1
  $res1 = mysqli_query($con,$sql1);

  $row1=mysqli_fetch_array($res1);

  $cl=$row1['class']."-".$row1['section'];
  $sql2="select * from teachers where classassign='$cl'";
  $res2 = mysqli_query($con,$sql2);

  $row2=mysqli_fetch_array($res2);

   $to=$row2['email'];
   $from=$row1['parentemail'];

  $result = array();

$sql = "select * from messages where (to_email='".$to."' and from_email='".$from."') OR (from_email='".$to."' and to_email='".$from."') ORDER BY post_date asc";
$res = mysqli_query($con,$sql);
while($row = mysqli_fetch_array($res))
{
    if($row['to_email']==$to)
        array_push($result,array('message_recd'=>$row['message']));
    else if($row['to_email']==$from)
        array_push($result,array('message_sent'=>$row['message']));

}


  /*$sql = "select * from messages where to_email='".$to."' and from_email='".$from."' ORDER BY post_date asc";
  $res = mysqli_query($con,$sql);

  while($row = mysqli_fetch_array($res))
    {
    array_push($result,array('message_recd'=>$row['message']));
    }

    $sqlw = "select * from messages where from_email='".$to."' and to_email='".$from."' ORDER BY post_date asc";
    $resw = mysqli_query($con,$sqlw);

    while($row5 = mysqli_fetch_array($resw))
    {

    array_push($result,array('message_sent'=>$row5['message']));
    }*/
    if(mysqli_query($con,$sql))
    {
       // echo 'success';
      }
      else
      {
        //echo 'failure';
      }
    //array_push($result,array('message_sent'=>"dfdsghdfgddfgdsd"));
    //array_push($result,array('message_sent'=>"sfdsflkufhskfhdskjfsfssadfadsffsafasfsfsadfafsaf"));

    //array_push($result,array('message_recd'=>$row1['parentemail'],'message_sent'=>$row2['email']));



//print_r($ress);
    echo json_encode($result);

    mysqli_close($con);

    ?>
3
  • Your json object has either message_sent or message_recd.. And you are always checking for both. The error says that your object doesnt have message_sent which is true {"message_recd":"checking"}. You need to check if message_sent exsits in json using json.has("message_sent") Commented Oct 2, 2015 at 10:36
  • i want to print both values message_recd as well as message_sent, is it possible? Commented Oct 2, 2015 at 10:40
  • check my answer for better solution Commented Oct 2, 2015 at 10:52

2 Answers 2

1

I made some changes on your code, but you have also to get the data inside an asynctask

class Person { 

   boolean messageReceived;
   public String message;

} 
public void onCreate(Bundle savedInstanceState){
///...
   for(int i=0;i<jArray.length();i++){
        JSONObject json_data = jArray.getJSONObject(i);

        Person resultRow = new Person();
        if (json_data.has("message_recd")){
            resultRow.messageReceived = true;
            resultRow.message = json_data.getString("message_recd");
        }
        else if (json_data.has("message_sent")){
            resultRow.messageReceived = false;
            resultRow.message = json_data.getString("message_sent");
        }
        arrayofWebData.add(resultRow);  

       //...
       //aa = new FancyAdapter();
       aa = new FancyAdapter(this,arrayofWebData);

       //...
}

class FancyAdapter extends ArrayAdapter<Person>{
    FancyAdapter(Activity activity, ArrayList<Person> list){ 
        super(activity,R.layout.row,list);
    } 
    public View getView(int position,View convertView,ViewGroup parent){
        Person selectedPerson = getItem(position);
        ViewHolder holder;

        if(convertView == null){
            LayoutInflater inflater = getLayoutInflater();
            convertView = inflater.inflate(R.layout.row, null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } 
        else{ 
            holder = (ViewHolder)convertView.getTag();
        } 
        holder.populateFrom(selectedPerson);
        return(convertView);
    } 
} 



class ViewHolder{ 
    public TextView messageReceived = null;
    public TextView messageSend = null;

    ViewHolder(View row){
        messageReceived = (TextView)row.findViewById(R.id.name);
        messageSend = (TextView)row.findViewById(R.id.colors);
    } 
    void populateFrom(Person p){
        if(p!=null && message !=null){
            if(p.messageReceived){
                messageReceived.setText(p.message);
                messageSend.setVisibility(View.INVISIBLE);
            }else{
                messageSend.setText(p.message);
                messageReceived.setVisibility(View.INVISIBLE);
            }
            message.setText(p.message);
        }
    } 
} 

PHP part

i believe you have your timestamp column named as timestamp

change that

$sql = "select * from messages where to_email='".$to."' and from_email='".$from."'";
$res = mysqli_query($con,$sql);
while($row = mysqli_fetch_array($res))
{
    array_push($result,array('message_recd'=>$row['message']));
}

$sqlw = "select * from messages where from_email='".$to."' and to_email='".$from."'";
$resw = mysqli_query($con,$sqlw);
while($row5 = mysqli_fetch_array($resw))
{
    array_push($result,array('message_sent'=>$row5['message']));
}

with that

$sql = "select * from messages where (to_email='".$to."' and from_email='".$from."') OR (from_email='".$to."' and to_email='".$from."') ORDER BY timestamp";
$res = mysqli_query($con,$sql);
while($row = mysqli_fetch_array($res))
{
    if($row['to_email']==$to)
        array_push($result,array('message_recd'=>$row['message']));
    else if($row['to_email']==$from)
        array_push($result,array('message_sent'=>$row['message']));

}
Sign up to request clarification or add additional context in comments.

29 Comments

I am getting error in last "message.setText(p)"->(The method setText(CharSequence) in the type TextView is not applicable for the arguments (MainActivity.Person))
my bad message.setText(p.message);
the application is crashing by doing this
i made a change to adapter constructor
messageRecieved cannot be resolved or is not a field inside for loop ,
|
0

Try to check if the json attribute exists before getting its value. Replace the below code to something similar

for(int i=0;i<jArray.length();i++){
        JSONObject json_data = jArray.getJSONObject(i);

        Person resultRow = new Person();
        if (json_data.has("message_recd")){
            resultRow.message_recd = json_data.getString("message_recd");
        }
        if (json_data.has("message_sent")){
            resultRow.message_sent = json_data.getString("message_sent");
        }
        arrayofWebData.add(resultRow);  

       //rest of the code

1 Comment

I have used your code but i am not getting the result the way i want.......i have used two textview and i want them to come after one another but when ever database is updated i am getting values of "message_recd" on top and "message_sent" values on bottom....

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.